Cabal-3.6.2.0: A framework for packaging Haskell software
Safe HaskellSafe-Inferred
LanguageHaskell2010

Distribution.Types.VersionInterval

Description

In Cabal-3.6 this module have been rewritten.

Synopsis

Version intervals

data VersionIntervals Source #

A complementary representation of a VersionRange. Instead of a boolean version predicate it uses an increasing sequence of non-overlapping, non-empty intervals.

The key point is that this representation gives a canonical representation for the semantics of VersionRanges. This makes it easier to check things like whether a version range is empty, covers all versions, or requires a certain minimum or maximum version. It also makes it easy to check equality or containment. It also makes it easier to identify 'simple' version predicates for translation into foreign packaging systems that do not support complex version range expressions.

unVersionIntervals :: VersionIntervals -> [VersionInterval] Source #

Inspect the list of version intervals.

Conversions

toVersionIntervals :: VersionRange -> VersionIntervals Source #

Convert a VersionRange to a sequence of version intervals.

fromVersionIntervals :: VersionIntervals -> VersionRange Source #

Convert a VersionIntervals value back into a VersionRange expression representing the version intervals.

Normalisation

normaliseVersionRange2 :: VersionRange -> VersionRange Source #

Since Cabal-3.6 this function.. TODO

Relaxation

Version intervals view

asVersionIntervals :: VersionRange -> [VersionInterval] Source #

View a VersionRange as a union of intervals.

This provides a canonical view of the semantics of a VersionRange as opposed to the syntax of the expression used to define it. For the syntactic view use foldVersionRange.

Each interval is non-empty. The sequence is in increasing order and no intervals overlap or touch. Therefore only the first and last can be unbounded. The sequence can be empty if the range is empty (e.g. a range expression like && 2).

Other checks are trivial to implement using this view. For example:

isNoVersion vr | [] <- asVersionIntervals vr = True
               | otherwise                   = False
isSpecificVersion vr
   | [(LowerBound v  InclusiveBound
      ,UpperBound v' InclusiveBound)] <- asVersionIntervals vr
   , v == v'   = Just v
   | otherwise = Nothing

data LowerBound Source #

Constructors

LowerBound !Version !Bound 

Instances

Instances details
Eq LowerBound Source # 
Instance details

Defined in Distribution.Types.VersionInterval

Show LowerBound Source # 
Instance details

Defined in Distribution.Types.VersionInterval

data UpperBound Source #

Instances

Instances details
Eq UpperBound Source # 
Instance details

Defined in Distribution.Types.VersionInterval

Show UpperBound Source # 
Instance details

Defined in Distribution.Types.VersionInterval

data Bound Source #

Instances

Instances details
Eq Bound Source # 
Instance details

Defined in Distribution.Types.VersionInterval

Methods

(==) :: Bound -> Bound -> Bool #

(/=) :: Bound -> Bound -> Bool #

Show Bound Source # 
Instance details

Defined in Distribution.Types.VersionInterval

Methods

showsPrec :: Int -> Bound -> ShowS #

show :: Bound -> String #

showList :: [Bound] -> ShowS #

Invariants

invariantVersionIntervals :: VersionIntervals -> Bool Source #

VersionIntervals invariant:

  • all intervals are valid (lower bound is less then upper bound, i.e. non-empty)
  • intervals doesn't touch each other (distinct)