module Distribution.Types.VersionRange (
VersionRange,
anyVersion, noVersion,
thisVersion, notThisVersion,
laterVersion, earlierVersion,
orLaterVersion, orEarlierVersion,
unionVersionRanges, intersectVersionRanges,
withinVersion,
majorBoundVersion,
withinRange,
foldVersionRange,
normaliseVersionRange,
stripParensVersionRange,
hasUpperBound,
hasLowerBound,
VersionRangeF (..),
cataVersionRange,
anaVersionRange,
hyloVersionRange,
projectVersionRange,
embedVersionRange,
wildcardUpperBound,
majorUpperBound,
isWildcardRange,
versionRangeParser,
) where
import Distribution.Compat.Prelude
import Distribution.Types.Version
import Distribution.Types.VersionRange.Internal
import Prelude ()
foldVersionRange :: a
-> (Version -> a)
-> (Version -> a)
-> (Version -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> VersionRange -> a
foldVersionRange :: a
-> (Version -> a)
-> (Version -> a)
-> (Version -> 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 union :: a -> a -> a
union intersect :: a -> a -> a
intersect = VersionRange -> a
fold
where
fold :: VersionRange -> a
fold = (VersionRangeF a -> a) -> VersionRange -> a
forall a. (VersionRangeF a -> a) -> VersionRange -> a
cataVersionRange VersionRangeF a -> a
alg
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 (OrLaterVersionF v :: Version
v) = a -> a -> a
union (Version -> a
this Version
v) (Version -> a
later Version
v)
alg (EarlierVersionF v :: Version
v) = Version -> a
earlier Version
v
alg (OrEarlierVersionF v :: Version
v) = a -> a -> a
union (Version -> a
this Version
v) (Version -> a
earlier Version
v)
alg (WildcardVersionF v :: Version
v) = VersionRange -> a
fold (Version -> VersionRange
wildcard Version
v)
alg (MajorBoundVersionF v :: Version
v) = VersionRange -> a
fold (Version -> VersionRange
majorBound 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
v
wildcard :: Version -> VersionRange
wildcard v :: Version
v = VersionRange -> VersionRange -> VersionRange
intersectVersionRanges
(Version -> VersionRange
orLaterVersion Version
v)
(Version -> VersionRange
earlierVersion (Version -> Version
wildcardUpperBound Version
v))
majorBound :: Version -> VersionRange
majorBound v :: Version
v = VersionRange -> VersionRange -> VersionRange
intersectVersionRanges
(Version -> VersionRange
orLaterVersion Version
v)
(Version -> VersionRange
earlierVersion (Version -> Version
majorUpperBound Version
v))
normaliseVersionRange :: VersionRange -> VersionRange
normaliseVersionRange :: VersionRange -> VersionRange
normaliseVersionRange = (VersionRangeF VersionRange -> VersionRange)
-> (VersionRange -> VersionRangeF VersionRange)
-> VersionRange
-> VersionRange
hyloVersionRange VersionRangeF VersionRange -> VersionRange
embed VersionRange -> VersionRangeF VersionRange
projectVersionRange
where
embed :: VersionRangeF VersionRange -> VersionRange
embed (UnionVersionRangesF (ThisVersion v :: Version
v) (LaterVersion v' :: Version
v')) | Version
v Version -> Version -> Bool
forall a. Eq a => a -> a -> Bool
== Version
v' =
Version -> VersionRange
orLaterVersion Version
v
embed (UnionVersionRangesF (LaterVersion v :: Version
v) (ThisVersion v' :: Version
v')) | Version
v Version -> Version -> Bool
forall a. Eq a => a -> a -> Bool
== Version
v' =
Version -> VersionRange
orLaterVersion Version
v
embed (UnionVersionRangesF (ThisVersion v :: Version
v) (EarlierVersion v' :: Version
v')) | Version
v Version -> Version -> Bool
forall a. Eq a => a -> a -> Bool
== Version
v' =
Version -> VersionRange
orEarlierVersion Version
v
embed (UnionVersionRangesF (EarlierVersion v :: Version
v) (ThisVersion v' :: Version
v')) | Version
v Version -> Version -> Bool
forall a. Eq a => a -> a -> Bool
== Version
v' =
Version -> VersionRange
orEarlierVersion Version
v
embed vr :: VersionRangeF VersionRange
vr = VersionRangeF VersionRange -> VersionRange
embedVersionRange VersionRangeF VersionRange
vr
stripParensVersionRange :: VersionRange -> VersionRange
stripParensVersionRange :: VersionRange -> VersionRange
stripParensVersionRange = (VersionRangeF VersionRange -> VersionRange)
-> (VersionRange -> VersionRangeF VersionRange)
-> VersionRange
-> VersionRange
hyloVersionRange VersionRangeF VersionRange -> VersionRange
embed VersionRange -> VersionRangeF VersionRange
projectVersionRange
where
embed :: VersionRangeF VersionRange -> VersionRange
embed (VersionRangeParensF vr :: VersionRange
vr) = VersionRange
vr
embed vr :: VersionRangeF VersionRange
vr = VersionRangeF VersionRange -> VersionRange
embedVersionRange VersionRangeF VersionRange
vr
withinRange :: Version -> VersionRange -> Bool
withinRange :: Version -> VersionRange -> Bool
withinRange v :: Version
v = Bool
-> (Version -> Bool)
-> (Version -> Bool)
-> (Version -> Bool)
-> (Bool -> Bool -> Bool)
-> (Bool -> Bool -> Bool)
-> VersionRange
-> Bool
forall a.
a
-> (Version -> a)
-> (Version -> a)
-> (Version -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> VersionRange
-> a
foldVersionRange
Bool
True
(\v' :: Version
v' -> Version
v Version -> Version -> Bool
forall a. Eq a => a -> a -> Bool
== Version
v')
(\v' :: Version
v' -> Version
v Version -> Version -> Bool
forall a. Ord a => a -> a -> Bool
> Version
v')
(\v' :: Version
v' -> Version
v Version -> Version -> Bool
forall a. Ord a => a -> a -> Bool
< Version
v')
Bool -> Bool -> Bool
(||)
Bool -> Bool -> Bool
(&&)
wildcardUpperBound :: Version -> Version
wildcardUpperBound :: Version -> Version
wildcardUpperBound = ([Int] -> [Int]) -> Version -> Version
alterVersion (([Int] -> [Int]) -> Version -> Version)
-> ([Int] -> [Int]) -> Version -> Version
forall a b. (a -> b) -> a -> b
$
\lowerBound :: [Int]
lowerBound -> [Int] -> [Int]
forall a. [a] -> [a]
init [Int]
lowerBound [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [[Int] -> Int
forall a. [a] -> a
last [Int]
lowerBound Int -> Int -> Int
forall a. Num a => a -> a -> a
+ 1]
isWildcardRange :: Version -> Version -> Bool
isWildcardRange :: Version -> Version -> Bool
isWildcardRange ver1 :: Version
ver1 ver2 :: Version
ver2 = [Int] -> [Int] -> Bool
forall a. (Eq a, Num a) => [a] -> [a] -> Bool
check (Version -> [Int]
versionNumbers Version
ver1) (Version -> [Int]
versionNumbers Version
ver2)
where check :: [a] -> [a] -> Bool
check (n :: a
n:[]) (m :: a
m:[]) | a
na -> a -> a
forall a. Num a => a -> a -> a
+1 a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
m = Bool
True
check (n :: a
n:ns :: [a]
ns) (m :: a
m:ms :: [a]
ms) | a
n a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
m = [a] -> [a] -> Bool
check [a]
ns [a]
ms
check _ _ = Bool
False
hasUpperBound :: VersionRange -> Bool
hasUpperBound :: VersionRange -> Bool
hasUpperBound = Bool
-> (Version -> Bool)
-> (Version -> Bool)
-> (Version -> Bool)
-> (Bool -> Bool -> Bool)
-> (Bool -> Bool -> Bool)
-> VersionRange
-> Bool
forall a.
a
-> (Version -> a)
-> (Version -> a)
-> (Version -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> VersionRange
-> a
foldVersionRange
Bool
False
(Bool -> Version -> Bool
forall a b. a -> b -> a
const Bool
True)
(Bool -> Version -> Bool
forall a b. a -> b -> a
const Bool
False)
(Bool -> Version -> Bool
forall a b. a -> b -> a
const Bool
True)
Bool -> Bool -> Bool
(&&) Bool -> Bool -> Bool
(||)
hasLowerBound :: VersionRange -> Bool
hasLowerBound :: VersionRange -> Bool
hasLowerBound = Bool
-> (Version -> Bool)
-> (Version -> Bool)
-> (Version -> Bool)
-> (Bool -> Bool -> Bool)
-> (Bool -> Bool -> Bool)
-> VersionRange
-> Bool
forall a.
a
-> (Version -> a)
-> (Version -> a)
-> (Version -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> VersionRange
-> a
foldVersionRange
Bool
False
(Bool -> Version -> Bool
forall a b. a -> b -> a
const Bool
True)
(Bool -> Version -> Bool
forall a b. a -> b -> a
const Bool
True)
(Bool -> Version -> Bool
forall a b. a -> b -> a
const Bool
False)
Bool -> Bool -> Bool
(&&) Bool -> Bool -> Bool
(||)