| ||||||||||||||||||||||||||

| ||||||||||||||||||||||||||

| ||||||||||||||||||||||||||

Description | ||||||||||||||||||||||||||

Exports the Version type along with a parser and pretty printer. A version
is something like "1.3.3". It also defines the VersionRange data
types. Version ranges are like ">= 1.2 && < 2".
| ||||||||||||||||||||||||||

Synopsis | ||||||||||||||||||||||||||

Package versions | ||||||||||||||||||||||||||

data Version | ||||||||||||||||||||||||||

| ||||||||||||||||||||||||||

Version ranges | ||||||||||||||||||||||||||

data VersionRange | ||||||||||||||||||||||||||

| ||||||||||||||||||||||||||

Constructing | ||||||||||||||||||||||||||

anyVersion :: VersionRange | ||||||||||||||||||||||||||

The version range withinRange v anyVersion = True | ||||||||||||||||||||||||||

noVersion :: VersionRange | ||||||||||||||||||||||||||

The empty version range, that is a version range containing no versions. This can be constructed using any unsatisfiable version range expression,
for example withinRange v anyVersion = False | ||||||||||||||||||||||||||

thisVersion :: Version -> VersionRange | ||||||||||||||||||||||||||

The version range withinRange v' (thisVersion v) = v' == v | ||||||||||||||||||||||||||

notThisVersion :: Version -> VersionRange | ||||||||||||||||||||||||||

The version range withinRange v' (notThisVersion v) = v' /= v | ||||||||||||||||||||||||||

laterVersion :: Version -> VersionRange | ||||||||||||||||||||||||||

The version range withinRange v' (laterVersion v) = v' > v | ||||||||||||||||||||||||||

earlierVersion :: Version -> VersionRange | ||||||||||||||||||||||||||

The version range withinRange v' (earlierVersion v) = v' < v | ||||||||||||||||||||||||||

orLaterVersion :: Version -> VersionRange | ||||||||||||||||||||||||||

The version range withinRange v' (orLaterVersion v) = v' >= v | ||||||||||||||||||||||||||

orEarlierVersion :: Version -> VersionRange | ||||||||||||||||||||||||||

The version range withinRange v' (orEarlierVersion v) = v' <= v | ||||||||||||||||||||||||||

unionVersionRanges :: VersionRange -> VersionRange -> VersionRange | ||||||||||||||||||||||||||

The version range withinRange v' (unionVersionRanges vr1 vr2) = withinRange v' vr1 || withinRange v' vr2 | ||||||||||||||||||||||||||

intersectVersionRanges :: VersionRange -> VersionRange -> VersionRange | ||||||||||||||||||||||||||

The version range withinRange v' (intersectVersionRanges vr1 vr2) = withinRange v' vr1 && withinRange v' vr2 | ||||||||||||||||||||||||||

withinVersion :: Version -> VersionRange | ||||||||||||||||||||||||||

The version range For example, for version withinRange v' (laterVersion v) = v' >= v && v' < upper v where upper (Version lower t) = Version (init lower ++ [last lower + 1]) t | ||||||||||||||||||||||||||

betweenVersionsInclusive :: Version -> Version -> VersionRange | ||||||||||||||||||||||||||

The version range In practice this is not very useful because we normally use inclusive lower bounds and exclusive upper bounds. withinRange v' (laterVersion v) = v' > v | ||||||||||||||||||||||||||

Inspection | ||||||||||||||||||||||||||

withinRange :: Version -> VersionRange -> Bool | ||||||||||||||||||||||||||

Does this version fall within the given range? This is the evaluation function for the | ||||||||||||||||||||||||||

isAnyVersion :: VersionRange -> Bool | ||||||||||||||||||||||||||

Does this Note this is a semantic check, not simply a syntactic check. So for example
the following is isAnyVersion (EarlierVersion v `UnionVersionRanges` orLaterVersion v) | ||||||||||||||||||||||||||

isNoVersion :: VersionRange -> Bool | ||||||||||||||||||||||||||

This is the converse of For example this is isNoVersion (EarlierVersion v `IntersectVersionRanges` LaterVersion v) | ||||||||||||||||||||||||||

isSpecificVersion :: VersionRange -> Maybe Version | ||||||||||||||||||||||||||

Is this version range in fact just a specific version? For example the version range | ||||||||||||||||||||||||||

simplifyVersionRange :: VersionRange -> VersionRange | ||||||||||||||||||||||||||

Simplify a If you need a canonical form use
It satisfies the following properties: withinRange v (simplifyVersionRange r) = withinRange v r withinRange v r = withinRange v r' ==> simplifyVersionRange r = simplifyVersionRange r' || isNoVersion r || isNoVersion r' | ||||||||||||||||||||||||||

foldVersionRange | ||||||||||||||||||||||||||

| ||||||||||||||||||||||||||

foldVersionRange' | ||||||||||||||||||||||||||

| ||||||||||||||||||||||||||

Version intervals view | ||||||||||||||||||||||||||

asVersionIntervals :: VersionRange -> [VersionInterval] | ||||||||||||||||||||||||||

View a This provides a canonical view of the semantics of a 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 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 | ||||||||||||||||||||||||||

type VersionInterval = (LowerBound, UpperBound) | ||||||||||||||||||||||||||

data LowerBound | ||||||||||||||||||||||||||

| ||||||||||||||||||||||||||

data UpperBound | ||||||||||||||||||||||||||

| ||||||||||||||||||||||||||

data Bound | ||||||||||||||||||||||||||

| ||||||||||||||||||||||||||

VersionIntervals abstract type
| ||||||||||||||||||||||||||

The VersionIntervals type and the accompanying functions are exposed
primarily for completeness and testing purposes. In practice
asVersionIntervals is the main function to use to
view a VersionRange as a bunch of VersionIntervals.
| ||||||||||||||||||||||||||

data VersionIntervals | ||||||||||||||||||||||||||

| ||||||||||||||||||||||||||

toVersionIntervals :: VersionRange -> VersionIntervals | ||||||||||||||||||||||||||

Convert a VersionRange to a sequence of version intervals.
| ||||||||||||||||||||||||||

fromVersionIntervals :: VersionIntervals -> VersionRange | ||||||||||||||||||||||||||

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

withinIntervals :: Version -> VersionIntervals -> Bool | ||||||||||||||||||||||||||

Test if a version falls within the version intervals. It exists mostly for completeness and testing. It satisfies the following properties: withinIntervals v (toVersionIntervals vr) = withinRange v vr withinIntervals v ivs = withinRange v (fromVersionIntervals ivs) | ||||||||||||||||||||||||||

versionIntervals :: VersionIntervals -> [VersionInterval] | ||||||||||||||||||||||||||

Inspect the list of version intervals. | ||||||||||||||||||||||||||

mkVersionIntervals :: [VersionInterval] -> Maybe VersionIntervals | ||||||||||||||||||||||||||

Directly construct a Each interval must be non-empty. The sequence must be in increasing order
and no invervals may overlap or touch. If any of these conditions are not
satisfied the function returns | ||||||||||||||||||||||||||

unionVersionIntervals :: VersionIntervals -> VersionIntervals -> VersionIntervals | ||||||||||||||||||||||||||

intersectVersionIntervals :: VersionIntervals -> VersionIntervals -> VersionIntervals | ||||||||||||||||||||||||||

Produced by Haddock version 2.6.1 |