Distribution.Types.VersionInterval

Cabal-3.6.3.0: A framework for packaging Haskell software

Safe Haskell | Safe-Inferred
Language | Haskell2010

Distribution.Types.VersionInterval

Contents

- Version intervals
- Conversions
  - Normalisation
- Relaxation
- Version intervals view
- Invariants

Description

In `Cabal-3.6` this module have been rewritten.

Synopsis

- data VersionIntervals
- unVersionIntervals :: VersionIntervals -> [VersionInterval]
- toVersionIntervals :: VersionRange -> VersionIntervals
- fromVersionIntervals :: VersionIntervals -> VersionRange
- normaliseVersionRange2 :: VersionRange -> VersionRange
- relaxLastInterval :: VersionIntervals -> VersionIntervals
- relaxHeadInterval :: VersionIntervals -> VersionIntervals
- asVersionIntervals :: VersionRange -> [VersionInterval]
- data VersionInterval = VersionInterval !LowerBound !UpperBound
- data LowerBound = LowerBound !Version !Bound
- data UpperBound
  - = NoUpperBound
  - | UpperBound !Version !Bound
- data Bound
  - = ExclusiveBound
  - | InclusiveBound
- invariantVersionIntervals :: VersionIntervals -> Bool

# 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 `VersionRange`s. 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.

#### Instances

Instances details

Show VersionIntervals Source # |
Instance details Defined in Distribution.Types.VersionInterval Methods showsPrec :: Int -> VersionIntervals -> ShowS Source # show :: VersionIntervals -> String Source # showList :: [VersionIntervals] -> ShowS Source #
Eq VersionIntervals Source # |
Instance details Defined in Distribution.Types.VersionInterval Methods (==) :: VersionIntervals -> VersionIntervals -> Bool # (/=) :: VersionIntervals -> VersionIntervals -> Bool #

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

relaxLastInterval :: VersionIntervals -> VersionIntervals Source #

relaxHeadInterval :: VersionIntervals -> VersionIntervals Source #

# 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 VersionInterval Source #

Constructors

VersionInterval !LowerBound !UpperBound |

#### Instances

Instances details

Show VersionInterval Source # |
Instance details Defined in Distribution.Types.VersionInterval Methods showsPrec :: Int -> VersionInterval -> ShowS Source # show :: VersionInterval -> String Source # showList :: [VersionInterval] -> ShowS Source #
Eq VersionInterval Source # |
Instance details Defined in Distribution.Types.VersionInterval Methods (==) :: VersionInterval -> VersionInterval -> Bool # (/=) :: VersionInterval -> VersionInterval -> Bool #

data LowerBound Source #

Constructors

LowerBound !Version !Bound |

#### Instances

Instances details

Show LowerBound Source # |
Instance details Defined in Distribution.Types.VersionInterval Methods showsPrec :: Int -> LowerBound -> ShowS Source # show :: LowerBound -> String Source # showList :: [LowerBound] -> ShowS Source #
Eq LowerBound Source # |
Instance details Defined in Distribution.Types.VersionInterval Methods (==) :: LowerBound -> LowerBound -> Bool # (/=) :: LowerBound -> LowerBound -> Bool #

data UpperBound Source #

Constructors

NoUpperBound |
UpperBound !Version !Bound |

#### Instances

Instances details

Show UpperBound Source # |
Instance details Defined in Distribution.Types.VersionInterval Methods showsPrec :: Int -> UpperBound -> ShowS Source # show :: UpperBound -> String Source # showList :: [UpperBound] -> ShowS Source #
Eq UpperBound Source # |
Instance details Defined in Distribution.Types.VersionInterval Methods (==) :: UpperBound -> UpperBound -> Bool # (/=) :: UpperBound -> UpperBound -> Bool #

data Bound Source #

Constructors

ExclusiveBound |
InclusiveBound |

#### Instances

Instances details

Show Bound Source # |
Instance details Defined in Distribution.Types.VersionInterval Methods showsPrec :: Int -> Bound -> ShowS Source # show :: Bound -> String Source # showList :: [Bound] -> ShowS Source #
Eq Bound Source # |
Instance details Defined in Distribution.Types.VersionInterval Methods (==) :: Bound -> Bound -> Bool # (/=) :: Bound -> Bound -> Bool #

# 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)