module Distribution.Version (
Version,
version0,
mkVersion,
mkVersion',
versionNumbers,
nullVersion,
alterVersion,
showVersion,
VersionRange(..),
anyVersion, noVersion,
thisVersion, notThisVersion,
laterVersion, earlierVersion,
orLaterVersion, orEarlierVersion,
unionVersionRanges, intersectVersionRanges,
differenceVersionRanges,
invertVersionRange,
withinVersion,
majorBoundVersion,
betweenVersionsInclusive,
withinRange,
isAnyVersion,
isNoVersion,
isSpecificVersion,
simplifyVersionRange,
foldVersionRange,
foldVersionRange',
normaliseVersionRange,
stripParensVersionRange,
hasUpperBound,
hasLowerBound,
VersionRangeF (..),
cataVersionRange,
anaVersionRange,
hyloVersionRange,
projectVersionRange,
embedVersionRange,
wildcardUpperBound,
majorUpperBound,
removeUpperBound,
removeLowerBound,
asVersionIntervals,
VersionInterval,
LowerBound(..),
UpperBound(..),
Bound(..),
VersionIntervals,
toVersionIntervals,
fromVersionIntervals,
withinIntervals,
versionIntervals,
mkVersionIntervals,
unionVersionIntervals,
intersectVersionIntervals,
invertVersionIntervals
) where
import Distribution.Types.Version
import Distribution.Types.VersionRange
import Distribution.Types.VersionInterval
isAnyVersion :: VersionRange -> Bool
isAnyVersion :: VersionRange -> Bool
isAnyVersion vr :: VersionRange
vr = case VersionRange -> [VersionInterval]
asVersionIntervals VersionRange
vr of
[(LowerBound v :: Version
v InclusiveBound, NoUpperBound)] | Version -> Bool
isVersion0 Version
v -> Bool
True
_ -> Bool
False
where
isVersion0 :: Version -> Bool
isVersion0 :: Version -> Bool
isVersion0 = (Version -> Version -> Bool
forall a. Eq a => a -> a -> Bool
== [Int] -> Version
mkVersion [0])
isNoVersion :: VersionRange -> Bool
isNoVersion :: VersionRange -> Bool
isNoVersion vr :: VersionRange
vr = case VersionRange -> [VersionInterval]
asVersionIntervals VersionRange
vr of
[] -> Bool
True
_ -> Bool
False
isSpecificVersion :: VersionRange -> Maybe Version
isSpecificVersion :: VersionRange -> Maybe Version
isSpecificVersion vr :: VersionRange
vr = case VersionRange -> [VersionInterval]
asVersionIntervals VersionRange
vr of
[(LowerBound v :: Version
v InclusiveBound
,UpperBound v' :: Version
v' InclusiveBound)]
| Version
v Version -> Version -> Bool
forall a. Eq a => a -> a -> Bool
== Version
v' -> Version -> Maybe Version
forall a. a -> Maybe a
Just Version
v
_ -> Maybe Version
forall a. Maybe a
Nothing
simplifyVersionRange :: VersionRange -> VersionRange
simplifyVersionRange :: VersionRange -> VersionRange
simplifyVersionRange vr :: VersionRange
vr
| [VersionInterval] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (VersionIntervals -> [VersionInterval]
versionIntervals VersionIntervals
vi) = VersionRange
vr
| Bool
otherwise = VersionIntervals -> VersionRange
fromVersionIntervals VersionIntervals
vi
where
vi :: VersionIntervals
vi = VersionRange -> VersionIntervals
toVersionIntervals VersionRange
vr
differenceVersionRanges :: VersionRange -> VersionRange -> VersionRange
differenceVersionRanges :: VersionRange -> VersionRange -> VersionRange
differenceVersionRanges vr1 :: VersionRange
vr1 vr2 :: VersionRange
vr2 =
VersionRange -> VersionRange -> VersionRange
intersectVersionRanges VersionRange
vr1 (VersionRange -> VersionRange
invertVersionRange VersionRange
vr2)
invertVersionRange :: VersionRange -> VersionRange
invertVersionRange :: VersionRange -> VersionRange
invertVersionRange =
VersionIntervals -> VersionRange
fromVersionIntervals (VersionIntervals -> VersionRange)
-> (VersionRange -> VersionIntervals)
-> VersionRange
-> VersionRange
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VersionIntervals -> VersionIntervals
invertVersionIntervals (VersionIntervals -> VersionIntervals)
-> (VersionRange -> VersionIntervals)
-> VersionRange
-> VersionIntervals
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VersionRange -> VersionIntervals
toVersionIntervals
removeUpperBound :: VersionRange -> VersionRange
removeUpperBound :: VersionRange -> VersionRange
removeUpperBound = VersionIntervals -> VersionRange
fromVersionIntervals (VersionIntervals -> VersionRange)
-> (VersionRange -> VersionIntervals)
-> VersionRange
-> VersionRange
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VersionIntervals -> VersionIntervals
relaxLastInterval (VersionIntervals -> VersionIntervals)
-> (VersionRange -> VersionIntervals)
-> VersionRange
-> VersionIntervals
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VersionRange -> VersionIntervals
toVersionIntervals
removeLowerBound :: VersionRange -> VersionRange
removeLowerBound :: VersionRange -> VersionRange
removeLowerBound = VersionIntervals -> VersionRange
fromVersionIntervals (VersionIntervals -> VersionRange)
-> (VersionRange -> VersionIntervals)
-> VersionRange
-> VersionRange
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VersionIntervals -> VersionIntervals
relaxHeadInterval (VersionIntervals -> VersionIntervals)
-> (VersionRange -> VersionIntervals)
-> VersionRange
-> VersionIntervals
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VersionRange -> VersionIntervals
toVersionIntervals
betweenVersionsInclusive :: Version -> Version -> VersionRange
betweenVersionsInclusive :: Version -> Version -> VersionRange
betweenVersionsInclusive v1 :: Version
v1 v2 :: Version
v2 =
VersionRange -> VersionRange -> VersionRange
intersectVersionRanges (Version -> VersionRange
orLaterVersion Version
v1) (Version -> VersionRange
orEarlierVersion Version
v2)
{-# DEPRECATED betweenVersionsInclusive
"In practice this is not very useful because we normally use inclusive lower bounds and exclusive upper bounds" #-}
foldVersionRange' :: a
-> (Version -> a)
-> (Version -> a)
-> (Version -> a)
-> (Version -> a)
-> (Version -> a)
-> (Version -> Version -> a)
-> (Version -> Version -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> VersionRange -> a
foldVersionRange' :: a
-> (Version -> a)
-> (Version -> a)
-> (Version -> a)
-> (Version -> a)
-> (Version -> a)
-> (Version -> Version -> a)
-> (Version -> Version -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> VersionRange
-> a
foldVersionRange' anyv :: a
anyv this :: Version -> a
this later :: Version -> a
later earlier :: Version -> a
earlier orLater :: Version -> a
orLater orEarlier :: Version -> a
orEarlier
wildcard :: Version -> Version -> a
wildcard major :: Version -> Version -> a
major union :: a -> a -> a
union intersect :: a -> a -> a
intersect parens :: a -> a
parens =
(VersionRangeF a -> a) -> VersionRange -> a
forall a. (VersionRangeF a -> a) -> VersionRange -> a
cataVersionRange VersionRangeF a -> a
alg (VersionRange -> a)
-> (VersionRange -> VersionRange) -> VersionRange -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VersionRange -> VersionRange
normaliseVersionRange
where
alg :: VersionRangeF a -> a
alg AnyVersionF = a
anyv
alg (ThisVersionF v :: Version
v) = Version -> a
this Version
v
alg (LaterVersionF v :: Version
v) = Version -> a
later Version
v
alg (EarlierVersionF v :: Version
v) = Version -> a
earlier Version
v
alg (OrLaterVersionF v :: Version
v) = Version -> a
orLater Version
v
alg (OrEarlierVersionF v :: Version
v) = Version -> a
orEarlier Version
v
alg (WildcardVersionF v :: Version
v) = Version -> Version -> a
wildcard Version
v (Version -> Version
wildcardUpperBound Version
v)
alg (MajorBoundVersionF v :: Version
v) = Version -> Version -> a
major Version
v (Version -> Version
majorUpperBound Version
v)
alg (UnionVersionRangesF v1 :: a
v1 v2 :: a
v2) = a -> a -> a
union a
v1 a
v2
alg (IntersectVersionRangesF v1 :: a
v1 v2 :: a
v2) = a -> a -> a
intersect a
v1 a
v2
alg (VersionRangeParensF v :: a
v) = a -> a
parens a
v
{-# DEPRECATED foldVersionRange' "Use cataVersionRange & normaliseVersionRange for more principled folding" #-}