content: {-# LANGUAGE GeneralizedNewtypeDeriving #-}
  {-# LANGUAGE DeriveDataTypeable #-}
  {-# LANGUAGE DeriveGeneric #-}
  module Distribution.Types.MungedPackageId
    ( MungedPackageId(..)
    , computeCompatPackageId
    ) where
  
  import Prelude ()
  import Distribution.Compat.Prelude
  
  import Distribution.Version
           ( Version, nullVersion )
  
  import qualified Distribution.Compat.ReadP as Parse
  import qualified Text.PrettyPrint as Disp
  import Distribution.Compat.ReadP
  import Distribution.Text
  import Distribution.Types.PackageId
  import Distribution.Types.UnqualComponentName
  import Distribution.Types.MungedPackageName
  
  -- | 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 Text MungedPackageId where
    disp (MungedPackageId n v)
      | v == nullVersion = disp n -- if no version, don't show version.
      | otherwise        = disp n <<>> Disp.char '-' <<>> disp v
  
    parse = do
      n <- parse
      v <- (Parse.char '-' >> parse) <++ return nullVersion
      return (MungedPackageId n v)
  
  instance NFData MungedPackageId where
      rnf (MungedPackageId name version) = rnf name `seq` rnf version
  
  -- | See docs for 'Distribution.Types.MungedPackageName.computeCompatPackageId'. this
  -- is a thin wrapper around that.
  computeCompatPackageId :: PackageId -> Maybe UnqualComponentName -> MungedPackageId
  computeCompatPackageId (PackageIdentifier pn vr) mb_uqn = MungedPackageId pn' vr
    where pn' = computeCompatPackageName pn mb_uqn
  