hix-0.7.0: lib/Hix/Data/Version.hs
module Hix.Data.Version (
module Hix.Data.Version,
Version,
VersionRange,
) where
import Data.Aeson (FromJSON (parseJSON))
import Data.Generics.Labels ()
import qualified Data.List.NonEmpty as NonEmpty
import Distribution.Pretty (Pretty (pretty))
import Distribution.Version (Version, VersionRange, anyVersion)
import Exon (exon)
import GHC.Exts (IsList)
import Text.PrettyPrint (Doc)
import Hix.Class.EncodeNix (EncodeNix)
import Hix.Class.Map (LookupMaybe, NMap, nGenWith, nPretty)
import Hix.Data.Json (jsonParsec)
import qualified Hix.Data.PackageId
import Hix.Data.PackageId (PackageId (PackageId))
import Hix.Data.PackageName (PackageName)
import Hix.Orphans.Version ()
import Hix.Pretty (prettyText)
range0 :: VersionRange
range0 = anyVersion
newtype SourceHash =
SourceHash Text
deriving stock (Eq, Show, Generic)
deriving newtype (Ord, FromJSON, EncodeNix)
instance Pretty SourceHash where
pretty (SourceHash h) = prettyText h
data Major =
Major {
prefix :: Version,
versions :: NonEmpty Version
}
deriving stock (Eq, Show, Generic)
prettyMajors :: NonEmpty Major -> Doc
prettyMajors = \case
[Major {prefix}] -> pretty prefix <> ".*"
majors -> [exon|#{pretty (NonEmpty.head majors).prefix}–#{pretty (NonEmpty.last majors).prefix}|]
newtype Versions =
Versions (Map PackageName Version)
deriving stock (Eq, Show, Generic)
deriving newtype (Semigroup, Monoid, IsList, EncodeNix)
instance NMap Versions PackageName Version LookupMaybe where
instance Pretty Versions where
pretty = nPretty
instance FromJSON Versions where
parseJSON v =
Versions . fmap jsonParsec <$> parseJSON v
packageIdVersions :: [PackageId] -> Versions
packageIdVersions =
nGenWith \ PackageId {name, version} -> (name, version)