content: {-# LANGUAGE DeriveDataTypeable #-}
  {-# LANGUAGE DeriveGeneric #-}
  module Distribution.Types.Dependency
    ( Dependency(..)
    , depPkgName
    , depVerRange
    , thisPackageVersion
    , notThisPackageVersion
    , simplifyDependency
    ) where
  
  import Prelude ()
  import Distribution.Compat.Prelude
  
  import Distribution.Version ( VersionRange, thisVersion
                              , notThisVersion, anyVersion
                              , simplifyVersionRange )
  
  import qualified Distribution.Compat.ReadP as Parse
  import Distribution.Compat.ReadP
  import Distribution.Text
  import Distribution.Types.PackageId
  import Distribution.Types.PackageName
  
  import Text.PrettyPrint ((<+>))
  
  -- | Describes a dependency on a source package (API)
  --
  data Dependency = Dependency PackageName VersionRange
                    deriving (Generic, Read, Show, Eq, Typeable, Data)
  
  depPkgName :: Dependency -> PackageName
  depPkgName (Dependency pn _) = pn
  
  depVerRange :: Dependency -> VersionRange
  depVerRange (Dependency _ vr) = vr
  
  instance Binary Dependency
  instance NFData Dependency where rnf = genericRnf
  
  instance Text Dependency where
    disp (Dependency name ver) =
      disp name <+> disp ver
  
    parse = do name <- parse
               Parse.skipSpaces
               ver <- parse <++ return anyVersion
               Parse.skipSpaces
               return (Dependency name ver)
  
  thisPackageVersion :: PackageIdentifier -> Dependency
  thisPackageVersion (PackageIdentifier n v) =
    Dependency n (thisVersion v)
  
  notThisPackageVersion :: PackageIdentifier -> Dependency
  notThisPackageVersion (PackageIdentifier n v) =
    Dependency n (notThisVersion v)
  
  -- | Simplify the 'VersionRange' expression in a 'Dependency'.
  -- See 'simplifyVersionRange'.
  --
  simplifyDependency :: Dependency -> Dependency
  simplifyDependency (Dependency name range) =
    Dependency name (simplifyVersionRange range)
  