Distribution/Types/MungedPackageId.hs

    {-# LANGUAGE DeriveDataTypeable #-}
    {-# LANGUAGE DeriveGeneric      #-}
    module Distribution.Types.MungedPackageId
      ( MungedPackageId(..)
      , computeCompatPackageId
      ) where

    import Distribution.Compat.Prelude
    import Prelude ()

    import Distribution.Parsec
    import Distribution.Pretty
    import Distribution.Types.LibraryName
    import Distribution.Types.MungedPackageName
    import Distribution.Types.PackageId
    import Distribution.Version                 (Version, nullVersion)

    import qualified Text.PrettyPrint as Disp

    -- | A simple pair of a 'MungedPackageName' and 'Version'. 'MungedPackageName' is to
    -- 'MungedPackageId' as 'PackageName' is to 'PackageId'. See 'MungedPackageName' for more
    -- info.
    data MungedPackageId
        = MungedPackageId {
            -- | The combined package and component name. see documentation for
            -- 'MungedPackageName'.
            mungedName    :: MungedPackageName,
            -- | The version of this package / component, eg 1.2
            mungedVersion :: Version
         }
         deriving (Generic, Read, Show, Eq, Ord, Typeable, Data)

    instance Binary MungedPackageId
    instance Structured MungedPackageId

    -- |
    --
    -- >>> prettyShow $ MungedPackageId (MungedPackageName "servant" LMainLibName) (mkVersion [1,2,3])
    -- "servant-1.2.3"
    --
    -- >>> prettyShow $ MungedPackageId (MungedPackageName "servant" (LSubLibName "lackey")) (mkVersion [0,1,2])
    -- "z-servant-z-lackey-0.1.2"
    --
    instance Pretty MungedPackageId where
        pretty (MungedPackageId n v)
            | v == nullVersion = pretty n -- if no version, don't show version.
            | otherwise        = pretty n <<>> Disp.char '-' <<>> pretty v

    -- |
    --
    -- >>> simpleParsec "foo-bar-0" :: Maybe MungedPackageId
    -- Just (MungedPackageId {mungedName = MungedPackageName (PackageName "foo-bar") LMainLibName, mungedVersion = mkVersion [0]})
    --
    -- >>> simpleParsec "foo-bar" :: Maybe MungedPackageId
    -- Just (MungedPackageId {mungedName = MungedPackageName (PackageName "foo-bar") LMainLibName, mungedVersion = mkVersion []})
    --
    -- >>> simpleParsec "z-foo-bar-z-baz-0" :: Maybe MungedPackageId
    -- Just (MungedPackageId {mungedName = MungedPackageName (PackageName "foo-bar") (LSubLibName (UnqualComponentName "baz")), mungedVersion = mkVersion [0]})
    --
    -- >>> simpleParsec "foo-bar-0-0" :: Maybe MungedPackageId
    -- Nothing
    --
    -- >>> simpleParsec "foo-bar.0" :: Maybe MungedPackageId
    -- Nothing
    --
    -- >>> simpleParsec "foo-bar.4-2" :: Maybe MungedPackageId
    -- Nothing
    --
    instance Parsec MungedPackageId where
        parsec = do
            PackageIdentifier pn v <- parsec
            return $ MungedPackageId (decodeCompatPackageName pn) v

    instance NFData MungedPackageId where
        rnf (MungedPackageId name version) = rnf name `seq` rnf version

    computeCompatPackageId :: PackageId -> LibraryName -> MungedPackageId
    computeCompatPackageId (PackageIdentifier pn vr) ln =
        MungedPackageId (MungedPackageName pn ln) vr

    -- $setup
    -- >>> :seti -XOverloadedStrings
    -- >>> import Distribution.Types.Version