module Distribution.Version (
  
  Version,
  version0,
  mkVersion,
  mkVersion',
  versionNumbers,
  nullVersion,
  alterVersion,
  
  VersionRange,
  
  anyVersion, noVersion,
  thisVersion, notThisVersion,
  laterVersion, earlierVersion,
  orLaterVersion, orEarlierVersion,
  unionVersionRanges, intersectVersionRanges,
  withinVersion,
  majorBoundVersion,
  
  withinRange,
  isAnyVersion,
  isNoVersion,
  isSpecificVersion,
  simplifyVersionRange,
  foldVersionRange,
  normaliseVersionRange,
  stripParensVersionRange,
  hasUpperBound,
  hasLowerBound,
  
  VersionRangeF (..),
  cataVersionRange,
  anaVersionRange,
  hyloVersionRange,
  projectVersionRange,
  embedVersionRange,
  
  wildcardUpperBound,
  majorUpperBound,
  
  removeUpperBound,
  removeLowerBound,
  transformCaret,
  transformCaretUpper,
  transformCaretLower,
  
  asVersionIntervals,
  VersionInterval(..),
  LowerBound(..),
  UpperBound(..),
  Bound(..),
  
  
  
  
  
  
  VersionIntervals,
  toVersionIntervals,
  fromVersionIntervals,
  unVersionIntervals,
 ) where
import Distribution.Types.Version
import Distribution.Types.VersionRange
import Distribution.Types.VersionInterval
isNoVersion :: VersionRange -> Bool
isNoVersion :: VersionRange -> Bool
isNoVersion VersionRange
vr = case VersionRange -> [VersionInterval]
asVersionIntervals VersionRange
vr of
  [] -> Bool
True
  [VersionInterval]
_  -> Bool
False
isSpecificVersion :: VersionRange -> Maybe Version
isSpecificVersion :: VersionRange -> Maybe Version
isSpecificVersion VersionRange
vr = case VersionRange -> [VersionInterval]
asVersionIntervals VersionRange
vr of
  [VersionInterval (LowerBound Version
v  Bound
InclusiveBound) (UpperBound Version
v' Bound
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
  [VersionInterval]
_           -> Maybe Version
forall a. Maybe a
Nothing
simplifyVersionRange :: VersionRange -> VersionRange
simplifyVersionRange :: VersionRange -> VersionRange
simplifyVersionRange VersionRange
vr
    
    
    
    | [VersionInterval] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (VersionIntervals -> [VersionInterval]
unVersionIntervals VersionIntervals
vi) = VersionRange
vr
    | Bool
otherwise                    = VersionIntervals -> VersionRange
fromVersionIntervals VersionIntervals
vi
  where
    vi :: VersionIntervals
vi = VersionRange -> VersionIntervals
toVersionIntervals VersionRange
vr
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
transformCaret :: VersionRange -> VersionRange
transformCaret :: VersionRange -> VersionRange
transformCaret = (VersionRangeF VersionRange -> VersionRange)
-> (VersionRange -> VersionRangeF VersionRange)
-> VersionRange
-> VersionRange
hyloVersionRange VersionRangeF VersionRange -> VersionRange
embed VersionRange -> VersionRangeF VersionRange
projectVersionRange where
    embed :: VersionRangeF VersionRange -> VersionRange
embed (MajorBoundVersionF Version
v) = Version -> VersionRange
orLaterVersion Version
v VersionRange -> VersionRange -> VersionRange
`intersectVersionRanges` Version -> VersionRange
earlierVersion (Version -> Version
majorUpperBound Version
v)
    embed VersionRangeF VersionRange
vr                     = VersionRangeF VersionRange -> VersionRange
embedVersionRange VersionRangeF VersionRange
vr
transformCaretUpper :: VersionRange -> VersionRange
transformCaretUpper :: VersionRange -> VersionRange
transformCaretUpper = (VersionRangeF VersionRange -> VersionRange)
-> (VersionRange -> VersionRangeF VersionRange)
-> VersionRange
-> VersionRange
hyloVersionRange VersionRangeF VersionRange -> VersionRange
embed VersionRange -> VersionRangeF VersionRange
projectVersionRange where
    embed :: VersionRangeF VersionRange -> VersionRange
embed (MajorBoundVersionF Version
v) = Version -> VersionRange
orLaterVersion Version
v
    embed VersionRangeF VersionRange
vr                     = VersionRangeF VersionRange -> VersionRange
embedVersionRange VersionRangeF VersionRange
vr
transformCaretLower :: VersionRange -> VersionRange
transformCaretLower :: VersionRange -> VersionRange
transformCaretLower = (VersionRangeF VersionRange -> VersionRange)
-> (VersionRange -> VersionRangeF VersionRange)
-> VersionRange
-> VersionRange
hyloVersionRange VersionRangeF VersionRange -> VersionRange
embed VersionRange -> VersionRangeF VersionRange
projectVersionRange where
    embed :: VersionRangeF VersionRange -> VersionRange
embed (MajorBoundVersionF Version
v) = Version -> VersionRange
earlierVersion (Version -> Version
majorUpperBound Version
v)
    embed VersionRangeF VersionRange
vr                     = VersionRangeF VersionRange -> VersionRange
embedVersionRange VersionRangeF VersionRange
vr