-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | Semantic version numbers and constraints.
--   
--   Salve provides semantic version (SemVer) numbers and constraints
--   (ranges).
@package salve
@version 1.0.3


-- | WARNING: This module should be considered private! If you find
--   yourself wanting to import something from this module, please open an
--   issue to get that thing exported from <a>Salve</a>.
module Salve.Internal

-- | A semantic version number. Versions have five parts:
--   
--   <ol>
--   <li><a>majorLens</a>: The major version number.</li>
--   <li><a>minorLens</a>: The minor version number.</li>
--   <li><a>patchLens</a>: The patch version number.</li>
--   <li><a>preReleasesLens</a>: A list of pre-release identifiers.</li>
--   <li><a>buildsLens</a>: A list of build metadata.</li>
--   </ol>
--   
--   Use <a>parseVersion</a> to create versions.
data Version
Version :: Word64 -> Word64 -> Word64 -> [PreRelease] -> [Build] -> Version
[versionMajor] :: Version -> Word64
[versionMinor] :: Version -> Word64
[versionPatch] :: Version -> Word64
[versionPreReleases] :: Version -> [PreRelease]
[versionBuilds] :: Version -> [Build]

-- | Pre-release information attached to a version. These can either be
--   numeric or textual. They must not be empty.
--   
--   <ul>
--   <li>Numeric: Can be any non-negative integer. Cannot have leading
--   zeros.</li>
--   <li>Textual: Can be any string of ASCII digits, letters, or hyphens.
--   Cannot be all digits, as that would be numeric.</li>
--   </ul>
--   
--   In general, pre-releases must match the regular expression
--   <tt>/^[-0-9A-Za-z]+$/</tt>.
--   
--   Use <a>parsePreRelease</a> to create pre-releases.
data PreRelease
PreReleaseNumeric :: Word64 -> PreRelease
PreReleaseTextual :: String -> PreRelease

-- | Build metadata attached to a version. These are similar to
--   <a>PreRelease</a>s with some key differences:
--   
--   <ol>
--   <li>There is no such thing as numeric builds. Even though builds can
--   look like numbers, all builds are textual.</li>
--   <li>As a result, builds that look numeric are allowed to have leading
--   zeros.</li>
--   <li>Builds cannot be compared. That is, they do not have an <a>Ord</a>
--   instance.</li>
--   </ol>
--   
--   Use <a>parseBuild</a> to create builds.
newtype Build
Build :: String -> Build

-- | Constrains allowable version numbers.
--   
--   Use <a>parseConstraint</a> to create constraints and
--   <a>satisfiesConstraint</a> to see if a version number satisfies a
--   constraint.
data Constraint
ConstraintOperator :: Operator -> Version -> Constraint
ConstraintHyphen :: Version -> Version -> Constraint
ConstraintWildcard :: Wildcard -> Constraint
ConstraintAnd :: Constraint -> Constraint -> Constraint
ConstraintOr :: Constraint -> Constraint -> Constraint

-- | Makes a new version number.
--   
--   <pre>
--   &gt;&gt;&gt; makeVersion 1 2 3 [unsafeParsePreRelease "pre"] [unsafeParseBuild "build"]
--   Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [PreReleaseTextual "pre"], versionBuilds = [Build "build"]}
--   </pre>
--   
--   This can be a useful alternative to <a>parseVersion</a> if you want a
--   total way to create a version.
makeVersion :: Word64 -> Word64 -> Word64 -> [PreRelease] -> [Build] -> Version

-- | The initial version number for development.
--   
--   <pre>
--   &gt;&gt;&gt; initialVersion
--   Version {versionMajor = 0, versionMinor = 0, versionPatch = 0, versionPreReleases = [], versionBuilds = []}
--   </pre>
initialVersion :: Version

-- | Attempts to parse a version. This parser follows <a>SemVer's BNF</a>.
--   
--   <pre>
--   &gt;&gt;&gt; parseVersion "1.2.3-p.4+b.5"
--   Just (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [PreReleaseTextual "p",PreReleaseNumeric 4], versionBuilds = [Build "b",Build "5"]})
--   </pre>
--   
--   Returns <a>Nothing</a> if the parse fails.
--   
--   <pre>
--   &gt;&gt;&gt; parseVersion "wrong"
--   Nothing
--   </pre>
--   
--   Whitespace is allowed.
--   
--   <pre>
--   &gt;&gt;&gt; parseVersion " 1.2.3 "
--   Just (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []})
--   </pre>
parseVersion :: String -> Maybe Version

-- | Attempts to parse a pre-release.
--   
--   <pre>
--   &gt;&gt;&gt; parsePreRelease "pre"
--   Just (PreReleaseTextual "pre")
--   
--   &gt;&gt;&gt; parsePreRelease "1"
--   Just (PreReleaseNumeric 1)
--   </pre>
--   
--   Returns <a>Nothing</a> if the parse fails.
--   
--   <pre>
--   &gt;&gt;&gt; parsePreRelease "wrong!"
--   Nothing
--   </pre>
--   
--   Numeric pre-releases cannot contain leading zeros.
--   
--   <pre>
--   &gt;&gt;&gt; parsePreRelease "01"
--   Nothing
--   </pre>
parsePreRelease :: String -> Maybe PreRelease

-- | Attempts to parse a build.
--   
--   <pre>
--   &gt;&gt;&gt; parseBuild "build"
--   Just (Build "build")
--   
--   &gt;&gt;&gt; parseBuild "1"
--   Just (Build "1")
--   </pre>
--   
--   Returns <a>Nothing</a> if the parse fails.
--   
--   <pre>
--   &gt;&gt;&gt; parseBuild "wrong!"
--   Nothing
--   </pre>
--   
--   Unlike pre-releases, numeric builds can have leading zeros.
--   
--   <pre>
--   &gt;&gt;&gt; parseBuild "01"
--   Just (Build "01")
--   </pre>
parseBuild :: String -> Maybe Build

-- | Attempts to parse a constraint. This parser mostly follows <a>npm's
--   BNF</a>.
--   
--   <pre>
--   &gt;&gt;&gt; parseConstraint "&gt;1.2.3"
--   Just (ConstraintOperator OperatorGT (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []}))
--   </pre>
--   
--   Returns <a>Nothing</a> if the parse fails.
--   
--   <pre>
--   &gt;&gt;&gt; parseConstraint "wrong"
--   Nothing
--   </pre>
--   
--   The two departures from npm's BNF are that x-ranges cannot be used
--   with other operators and partial version numbers are not allowed.
--   
--   <pre>
--   &gt;&gt;&gt; parseConstraint "1.2.x"
--   Just (ConstraintWildcard (WildcardPatch 1 2))
--   
--   &gt;&gt;&gt; parseConstraint "&gt;=1.2.x"
--   Nothing
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; parseConstraint "1.2"
--   Nothing
--   
--   &gt;&gt;&gt; parseConstraint "&gt;=1.2"
--   Nothing
--   </pre>
parseConstraint :: String -> Maybe Constraint

-- | Parses a version.
--   
--   <pre>
--   &gt;&gt;&gt; unsafeParseVersion "1.2.3-p.4+b.5"
--   Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [PreReleaseTextual "p",PreReleaseNumeric 4], versionBuilds = [Build "b",Build "5"]}
--   </pre>
--   
--   Raises an exception if the parse fails.
--   
--   <pre>
--   &gt;&gt;&gt; unsafeParseVersion "wrong"
--   *** Exception: unsafeParseVersion: invalid version: "wrong"
--   ...
--   </pre>
--   
--   See <a>parseVersion</a> for a safe version of this function.
unsafeParseVersion :: String -> Version

-- | Parses a pre-release.
--   
--   <pre>
--   &gt;&gt;&gt; unsafeParsePreRelease "pre"
--   PreReleaseTextual "pre"
--   </pre>
--   
--   Raises an exception if the parse fails.
--   
--   <pre>
--   &gt;&gt;&gt; unsafeParsePreRelease "wrong!"
--   *** Exception: unsafeParsePreRelease: invalid pre-release: "wrong!"
--   ...
--   </pre>
--   
--   See <a>parsePreRelease</a> for a safe version of this function.
unsafeParsePreRelease :: String -> PreRelease

-- | Parses a build.
--   
--   <pre>
--   &gt;&gt;&gt; unsafeParseBuild "build"
--   Build "build"
--   </pre>
--   
--   Raises an exception if the parse fails.
--   
--   <pre>
--   &gt;&gt;&gt; unsafeParseBuild "wrong!"
--   Build "*** Exception: unsafeParseBuild: invalid build: "wrong!"
--   ...
--   </pre>
--   
--   See <a>parseBuild</a> for a safe version of this function.
unsafeParseBuild :: String -> Build

-- | Parses a constraint.
--   
--   <pre>
--   &gt;&gt;&gt; unsafeParseConstraint "&gt;1.2.3"
--   ConstraintOperator OperatorGT (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []})
--   </pre>
--   
--   Raises an exception if the parse fails.
--   
--   <pre>
--   &gt;&gt;&gt; unsafeParseConstraint "wrong"
--   *** Exception: unsafeParseConstraint: invalid constraint: "wrong"
--   ...
--   </pre>
--   
--   See <a>parseConstraint</a> for a safe version of this function.
unsafeParseConstraint :: String -> Constraint

-- | Renders a version.
--   
--   <pre>
--   &gt;&gt;&gt; renderVersion &lt;$&gt; parseVersion "1.2.3-p.4+b.5"
--   Just "1.2.3-p.4+b.5"
--   </pre>
renderVersion :: Version -> String

-- | Renders a pre-release.
--   
--   <pre>
--   &gt;&gt;&gt; renderPreRelease &lt;$&gt; parsePreRelease "pre"
--   Just "pre"
--   
--   &gt;&gt;&gt; renderPreRelease &lt;$&gt; parsePreRelease "1"
--   Just "1"
--   </pre>
renderPreRelease :: PreRelease -> String

-- | Renders a build.
--   
--   <pre>
--   &gt;&gt;&gt; renderBuild &lt;$&gt; parseBuild "build"
--   Just "build"
--   
--   &gt;&gt;&gt; renderBuild &lt;$&gt; parseBuild "1"
--   Just "1"
--   </pre>
renderBuild :: Build -> String

-- | Renders a constraint.
--   
--   <pre>
--   &gt;&gt;&gt; renderConstraint &lt;$&gt; parseConstraint "&gt;1.2.3"
--   Just "&gt;1.2.3"
--   </pre>
--   
--   Parsing and rendering a constraint doesn't always return what you
--   started with.
--   
--   <pre>
--   &gt;&gt;&gt; renderConstraint &lt;$&gt; parseConstraint "=1.2.3"
--   Just "1.2.3"
--   </pre>
renderConstraint :: Constraint -> String

-- | Returns <a>True</a> if the major version number is zero, <a>False</a>
--   otherwise.
--   
--   <pre>
--   &gt;&gt;&gt; isUnstable &lt;$&gt; parseVersion "0.1.2"
--   Just True
--   
--   &gt;&gt;&gt; isUnstable &lt;$&gt; parseVersion "1.0.0"
--   Just False
--   </pre>
isUnstable :: Version -> Bool

-- | Returns <a>True</a> if the major version number is not zero,
--   <a>False</a> otherwise.
--   
--   <pre>
--   &gt;&gt;&gt; isStable &lt;$&gt; parseVersion "1.0.0"
--   Just True
--   
--   &gt;&gt;&gt; isStable &lt;$&gt; parseVersion "0.1.2"
--   Just False
--   </pre>
isStable :: Version -> Bool

-- | Converts from a <a>Version</a> from the <tt>base</tt> package.
--   
--   <pre>
--   &gt;&gt;&gt; renderVersion . fromBaseVersion $ Version.makeVersion [1, 2, 3]
--   "1.2.3"
--   </pre>
--   
--   Missing version components are set to zero.
--   
--   <pre>
--   &gt;&gt;&gt; renderVersion . fromBaseVersion $ Version.makeVersion []
--   "0.0.0"
--   
--   &gt;&gt;&gt; renderVersion . fromBaseVersion $ Version.makeVersion [1]
--   "1.0.0"
--   
--   &gt;&gt;&gt; renderVersion . fromBaseVersion $ Version.makeVersion [1, 2]
--   "1.2.0"
--   </pre>
--   
--   Extra version components are ignored.
--   
--   <pre>
--   &gt;&gt;&gt; renderVersion . fromBaseVersion $ Version.makeVersion [1, 2, 3, 4]
--   "1.2.3"
--   </pre>
--   
--   Tags are ignored.
--   
--   <pre>
--   &gt;&gt;&gt; renderVersion . fromBaseVersion $ Version.Version [] ["ignored"]
--   "0.0.0"
--   </pre>
fromBaseVersion :: Version -> Version

-- | Converts to a <a>Version</a> from the <tt>base</tt> package.
--   
--   <pre>
--   &gt;&gt;&gt; toBaseVersion &lt;$&gt; parseVersion "1.2.3"
--   Just (Version {versionBranch = [1,2,3], versionTags = []})
--   </pre>
--   
--   Pre-releases and builds are converted to tags.
--   
--   <pre>
--   &gt;&gt;&gt; toBaseVersion &lt;$&gt; parseVersion "1.2.3-pre+build"
--   Just (Version {versionBranch = [1,2,3], versionTags = ["pre","build"]})
--   </pre>
toBaseVersion :: Version -> Version

-- | Increments the major version number.
--   
--   <pre>
--   &gt;&gt;&gt; bumpMajor &lt;$&gt; parseVersion "0.0.0"
--   Just (Version {versionMajor = 1, versionMinor = 0, versionPatch = 0, versionPreReleases = [], versionBuilds = []})
--   </pre>
--   
--   The minor and patch numbers are reset to zero.
--   
--   <pre>
--   &gt;&gt;&gt; bumpMajor &lt;$&gt; parseVersion "1.2.3"
--   Just (Version {versionMajor = 2, versionMinor = 0, versionPatch = 0, versionPreReleases = [], versionBuilds = []})
--   </pre>
--   
--   The pre-releases and builds are removed.
--   
--   <pre>
--   &gt;&gt;&gt; bumpMajor &lt;$&gt; parseVersion "0.0.0-pre+build"
--   Just (Version {versionMajor = 1, versionMinor = 0, versionPatch = 0, versionPreReleases = [], versionBuilds = []})
--   </pre>
--   
--   Consider using <a>majorLens</a> if you want to arbitrarily change the
--   major number, or if you don't want the other parts of the version to
--   change.
bumpMajor :: Version -> Version

-- | Increments the minor version number.
--   
--   <pre>
--   &gt;&gt;&gt; bumpMinor &lt;$&gt; parseVersion "0.0.0"
--   Just (Version {versionMajor = 0, versionMinor = 1, versionPatch = 0, versionPreReleases = [], versionBuilds = []})
--   </pre>
--   
--   The patch number is reset to zero.
--   
--   <pre>
--   &gt;&gt;&gt; bumpMinor &lt;$&gt; parseVersion "1.2.3"
--   Just (Version {versionMajor = 1, versionMinor = 3, versionPatch = 0, versionPreReleases = [], versionBuilds = []})
--   </pre>
--   
--   The pre-releases and builds are removed.
--   
--   <pre>
--   &gt;&gt;&gt; bumpMinor &lt;$&gt; parseVersion "0.0.0-pre+build"
--   Just (Version {versionMajor = 0, versionMinor = 1, versionPatch = 0, versionPreReleases = [], versionBuilds = []})
--   </pre>
--   
--   Consider using <a>minorLens</a> if you want to arbitrarily change the
--   minor number, or if you don't want the other parts of the version to
--   change.
bumpMinor :: Version -> Version

-- | Increments the patch number.
--   
--   <pre>
--   &gt;&gt;&gt; bumpPatch &lt;$&gt; parseVersion "0.0.0"
--   Just (Version {versionMajor = 0, versionMinor = 0, versionPatch = 1, versionPreReleases = [], versionBuilds = []})
--   </pre>
--   
--   The major and minor numbers are not changed.
--   
--   <pre>
--   &gt;&gt;&gt; bumpPatch &lt;$&gt; parseVersion "1.2.3"
--   Just (Version {versionMajor = 1, versionMinor = 2, versionPatch = 4, versionPreReleases = [], versionBuilds = []})
--   </pre>
--   
--   The pre-releases and builds are removed.
--   
--   <pre>
--   &gt;&gt;&gt; bumpPatch &lt;$&gt; parseVersion "0.0.0-pre+build"
--   Just (Version {versionMajor = 0, versionMinor = 0, versionPatch = 1, versionPreReleases = [], versionBuilds = []})
--   </pre>
--   
--   Consider using <a>patchLens</a> if you want to arbitrarily change the
--   patch number, or if you don't want the other parts of the version to
--   change.
bumpPatch :: Version -> Version

-- | Returns <a>True</a> if the version satisfies the constraint,
--   <a>False</a> otherwise.
--   
--   <pre>
--   &gt;&gt;&gt; satisfiesConstraint &lt;$&gt; parseConstraint "&gt;1.2.0" &lt;*&gt; parseVersion "1.2.3"
--   Just True
--   </pre>
satisfiesConstraint :: Constraint -> Version -> Bool

-- | Focuses on the major version number.
--   
--   <pre>
--   &gt;&gt;&gt; view majorLens &lt;$&gt; parseVersion "1.2.3-pre.4+build.5"
--   Just 1
--   
--   &gt;&gt;&gt; set majorLens 4 &lt;$&gt; parseVersion "1.2.3"
--   Just (Version {versionMajor = 4, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []})
--   </pre>
majorLens :: Functor f => (Word64 -> f Word64) -> Version -> f Version

-- | Focuses on the minor version number.
--   
--   <pre>
--   &gt;&gt;&gt; view minorLens &lt;$&gt; parseVersion "1.2.3-pre.4+build.5"
--   Just 2
--   
--   &gt;&gt;&gt; set minorLens 4 &lt;$&gt; parseVersion "1.2.3"
--   Just (Version {versionMajor = 1, versionMinor = 4, versionPatch = 3, versionPreReleases = [], versionBuilds = []})
--   </pre>
minorLens :: Functor f => (Word64 -> f Word64) -> Version -> f Version

-- | Focuses on the patch version number.
--   
--   <pre>
--   &gt;&gt;&gt; view patchLens &lt;$&gt; parseVersion "1.2.3-pre.4+build.5"
--   Just 3
--   
--   &gt;&gt;&gt; set patchLens 4 &lt;$&gt; parseVersion "1.2.3"
--   Just (Version {versionMajor = 1, versionMinor = 2, versionPatch = 4, versionPreReleases = [], versionBuilds = []})
--   </pre>
patchLens :: Functor f => (Word64 -> f Word64) -> Version -> f Version

-- | Focuses on the pre-release identifiers.
--   
--   <pre>
--   &gt;&gt;&gt; view preReleasesLens &lt;$&gt; parseVersion "1.2.3-pre.4+build.5"
--   Just [PreReleaseTextual "pre",PreReleaseNumeric 4]
--   
--   &gt;&gt;&gt; set preReleasesLens [] &lt;$&gt; parseVersion "1.2.3-pre"
--   Just (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []})
--   </pre>
preReleasesLens :: Functor f => ([PreRelease] -> f [PreRelease]) -> Version -> f Version

-- | Focuses on the build metadata.
--   
--   <pre>
--   &gt;&gt;&gt; view buildsLens &lt;$&gt; parseVersion "1.2.3-pre.4+build.5"
--   Just [Build "build",Build "5"]
--   
--   &gt;&gt;&gt; set buildsLens [] &lt;$&gt; parseVersion "1.2.3+build"
--   Just (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []})
--   </pre>
buildsLens :: Functor f => ([Build] -> f [Build]) -> Version -> f Version
data Operator
OperatorLT :: Operator
OperatorLE :: Operator
OperatorEQ :: Operator
OperatorGE :: Operator
OperatorGT :: Operator
OperatorTilde :: Operator
OperatorCaret :: Operator
data Wildcard
WildcardMajor :: Wildcard
WildcardMinor :: Word64 -> Wildcard
WildcardPatch :: Word64 -> Word64 -> Wildcard

-- | Makes a new constraint that must be less than the version number.
--   
--   <pre>
--   &gt;&gt;&gt; constraintLT &lt;$&gt; parseVersion "1.2.3"
--   Just (ConstraintOperator OperatorLT (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []}))
--   
--   &gt;&gt;&gt; parseConstraint "&lt;1.2.3"
--   Just (ConstraintOperator OperatorLT (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []}))
--   </pre>
constraintLT :: Version -> Constraint

-- | Makes a new constraint that must be less than or euqal to the version
--   number.
--   
--   <pre>
--   &gt;&gt;&gt; constraintLE &lt;$&gt; parseVersion "1.2.3"
--   Just (ConstraintOperator OperatorLE (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []}))
--   
--   &gt;&gt;&gt; parseConstraint "&lt;=1.2.3"
--   Just (ConstraintOperator OperatorLE (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []}))
--   </pre>
constraintLE :: Version -> Constraint

-- | Makes a new constraint that must be equal to the version number.
--   
--   <pre>
--   &gt;&gt;&gt; constraintEQ &lt;$&gt; parseVersion "1.2.3"
--   Just (ConstraintOperator OperatorEQ (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []}))
--   
--   &gt;&gt;&gt; parseConstraint "=1.2.3"
--   Just (ConstraintOperator OperatorEQ (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []}))
--   </pre>
constraintEQ :: Version -> Constraint

-- | Makes a new constraint that must be greater than or equal to the
--   version number.
--   
--   <pre>
--   &gt;&gt;&gt; constraintGE &lt;$&gt; parseVersion "1.2.3"
--   Just (ConstraintOperator OperatorGE (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []}))
--   
--   &gt;&gt;&gt; parseConstraint "&gt;=1.2.3"
--   Just (ConstraintOperator OperatorGE (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []}))
--   </pre>
constraintGE :: Version -> Constraint

-- | Makes a new constraint that must be greater than the version number.
--   
--   <pre>
--   &gt;&gt;&gt; constraintGT &lt;$&gt; parseVersion "1.2.3"
--   Just (ConstraintOperator OperatorGT (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []}))
--   
--   &gt;&gt;&gt; parseConstraint "&gt;1.2.3"
--   Just (ConstraintOperator OperatorGT (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []}))
--   </pre>
constraintGT :: Version -> Constraint

-- | Makes a new constraint that must satisfy both constraints.
--   
--   <pre>
--   &gt;&gt;&gt; constraintAnd &lt;$&gt; (constraintGE &lt;$&gt; parseVersion "1.2.3") &lt;*&gt; (constraintLT &lt;$&gt; parseVersion "2.0.0")
--   Just (ConstraintAnd (ConstraintOperator OperatorGE (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []})) (ConstraintOperator OperatorLT (Version {versionMajor = 2, versionMinor = 0, versionPatch = 0, versionPreReleases = [], versionBuilds = []})))
--   
--   &gt;&gt;&gt; parseConstraint "&gt;=1.2.3 &lt;2.0.0"
--   Just (ConstraintAnd (ConstraintOperator OperatorGE (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []})) (ConstraintOperator OperatorLT (Version {versionMajor = 2, versionMinor = 0, versionPatch = 0, versionPreReleases = [], versionBuilds = []})))
--   </pre>
constraintAnd :: Constraint -> Constraint -> Constraint

-- | Makes a new constraint that must satisfy either constraint.
--   
--   <pre>
--   &gt;&gt;&gt; constraintOr &lt;$&gt; (constraintEQ &lt;$&gt; parseVersion "1.2.3") &lt;*&gt; (constraintGT &lt;$&gt; parseVersion "1.2.3")
--   Just (ConstraintOr (ConstraintOperator OperatorEQ (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []})) (ConstraintOperator OperatorGT (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []})))
--   
--   &gt;&gt;&gt; parseConstraint "=1.2.3 || &gt;1.2.3"
--   Just (ConstraintOr (ConstraintOperator OperatorEQ (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []})) (ConstraintOperator OperatorGT (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []})))
--   </pre>
constraintOr :: Constraint -> Constraint -> Constraint

-- | Makes a new constraint that must be between the versions, inclusive.
--   
--   <pre>
--   &gt;&gt;&gt; constraintHyphen &lt;$&gt; parseVersion "1.2.3" &lt;*&gt; parseVersion "2.3.4"
--   Just (ConstraintHyphen (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []}) (Version {versionMajor = 2, versionMinor = 3, versionPatch = 4, versionPreReleases = [], versionBuilds = []}))
--   
--   &gt;&gt;&gt; parseConstraint "1.2.3 - 2.3.4"
--   Just (ConstraintHyphen (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []}) (Version {versionMajor = 2, versionMinor = 3, versionPatch = 4, versionPreReleases = [], versionBuilds = []}))
--   </pre>
constraintHyphen :: Version -> Version -> Constraint

-- | Makes a new constraint that allows changes to the patch version
--   number.
--   
--   <pre>
--   &gt;&gt;&gt; constraintTilde &lt;$&gt; parseVersion "1.2.3"
--   Just (ConstraintOperator OperatorTilde (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []}))
--   
--   &gt;&gt;&gt; parseConstraint "~1.2.3"
--   Just (ConstraintOperator OperatorTilde (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []}))
--   </pre>
constraintTilde :: Version -> Constraint

-- | Makes a new constraint that allows changes that do not modify the
--   left-most non-zero version number.
--   
--   <pre>
--   &gt;&gt;&gt; constraintCaret &lt;$&gt; parseVersion "1.2.3"
--   Just (ConstraintOperator OperatorCaret (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []}))
--   
--   &gt;&gt;&gt; parseConstraint "^1.2.3"
--   Just (ConstraintOperator OperatorCaret (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []}))
--   </pre>
constraintCaret :: Version -> Constraint
instance GHC.Show.Show Salve.Internal.SimpleConstraint
instance GHC.Read.Read Salve.Internal.SimpleConstraint
instance GHC.Classes.Ord Salve.Internal.SimpleConstraint
instance GHC.Generics.Generic Salve.Internal.SimpleConstraint
instance GHC.Classes.Eq Salve.Internal.SimpleConstraint
instance Data.Data.Data Salve.Internal.SimpleConstraint
instance GHC.Show.Show Salve.Internal.Constraint
instance GHC.Read.Read Salve.Internal.Constraint
instance GHC.Classes.Ord Salve.Internal.Constraint
instance GHC.Generics.Generic Salve.Internal.Constraint
instance GHC.Classes.Eq Salve.Internal.Constraint
instance Data.Data.Data Salve.Internal.Constraint
instance GHC.Show.Show Salve.Internal.Wildcard
instance GHC.Read.Read Salve.Internal.Wildcard
instance GHC.Classes.Ord Salve.Internal.Wildcard
instance GHC.Generics.Generic Salve.Internal.Wildcard
instance GHC.Classes.Eq Salve.Internal.Wildcard
instance Data.Data.Data Salve.Internal.Wildcard
instance GHC.Show.Show Salve.Internal.Operator
instance GHC.Read.Read Salve.Internal.Operator
instance GHC.Classes.Ord Salve.Internal.Operator
instance GHC.Generics.Generic Salve.Internal.Operator
instance GHC.Classes.Eq Salve.Internal.Operator
instance Data.Data.Data Salve.Internal.Operator
instance GHC.Show.Show Salve.Internal.Version
instance GHC.Read.Read Salve.Internal.Version
instance GHC.Generics.Generic Salve.Internal.Version
instance GHC.Classes.Eq Salve.Internal.Version
instance Data.Data.Data Salve.Internal.Version
instance GHC.Show.Show Salve.Internal.Build
instance GHC.Read.Read Salve.Internal.Build
instance GHC.Generics.Generic Salve.Internal.Build
instance GHC.Classes.Eq Salve.Internal.Build
instance Data.Data.Data Salve.Internal.Build
instance GHC.Show.Show Salve.Internal.PreRelease
instance GHC.Read.Read Salve.Internal.PreRelease
instance GHC.Generics.Generic Salve.Internal.PreRelease
instance GHC.Classes.Eq Salve.Internal.PreRelease
instance Data.Data.Data Salve.Internal.PreRelease
instance GHC.Classes.Ord Salve.Internal.Version
instance GHC.Classes.Ord Salve.Internal.PreRelease


-- | This module defines types and functions for working with versions as
--   defined by <a>Semantic Versioning</a>. It also provides types and
--   functions for working with version constraints as described by
--   <a>npm</a>.
module Salve

-- | A semantic version number. Versions have five parts:
--   
--   <ol>
--   <li><a>majorLens</a>: The major version number.</li>
--   <li><a>minorLens</a>: The minor version number.</li>
--   <li><a>patchLens</a>: The patch version number.</li>
--   <li><a>preReleasesLens</a>: A list of pre-release identifiers.</li>
--   <li><a>buildsLens</a>: A list of build metadata.</li>
--   </ol>
--   
--   Use <a>parseVersion</a> to create versions.
data Version

-- | Pre-release information attached to a version. These can either be
--   numeric or textual. They must not be empty.
--   
--   <ul>
--   <li>Numeric: Can be any non-negative integer. Cannot have leading
--   zeros.</li>
--   <li>Textual: Can be any string of ASCII digits, letters, or hyphens.
--   Cannot be all digits, as that would be numeric.</li>
--   </ul>
--   
--   In general, pre-releases must match the regular expression
--   <tt>/^[-0-9A-Za-z]+$/</tt>.
--   
--   Use <a>parsePreRelease</a> to create pre-releases.
data PreRelease

-- | Build metadata attached to a version. These are similar to
--   <a>PreRelease</a>s with some key differences:
--   
--   <ol>
--   <li>There is no such thing as numeric builds. Even though builds can
--   look like numbers, all builds are textual.</li>
--   <li>As a result, builds that look numeric are allowed to have leading
--   zeros.</li>
--   <li>Builds cannot be compared. That is, they do not have an <a>Ord</a>
--   instance.</li>
--   </ol>
--   
--   Use <a>parseBuild</a> to create builds.
data Build

-- | Constrains allowable version numbers.
--   
--   Use <a>parseConstraint</a> to create constraints and
--   <a>satisfiesConstraint</a> to see if a version number satisfies a
--   constraint.
data Constraint

-- | Makes a new version number.
--   
--   <pre>
--   &gt;&gt;&gt; makeVersion 1 2 3 [unsafeParsePreRelease "pre"] [unsafeParseBuild "build"]
--   Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [PreReleaseTextual "pre"], versionBuilds = [Build "build"]}
--   </pre>
--   
--   This can be a useful alternative to <a>parseVersion</a> if you want a
--   total way to create a version.
makeVersion :: Word64 -> Word64 -> Word64 -> [PreRelease] -> [Build] -> Version

-- | The initial version number for development.
--   
--   <pre>
--   &gt;&gt;&gt; initialVersion
--   Version {versionMajor = 0, versionMinor = 0, versionPatch = 0, versionPreReleases = [], versionBuilds = []}
--   </pre>
initialVersion :: Version

-- | Attempts to parse a version. This parser follows <a>SemVer's BNF</a>.
--   
--   <pre>
--   &gt;&gt;&gt; parseVersion "1.2.3-p.4+b.5"
--   Just (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [PreReleaseTextual "p",PreReleaseNumeric 4], versionBuilds = [Build "b",Build "5"]})
--   </pre>
--   
--   Returns <a>Nothing</a> if the parse fails.
--   
--   <pre>
--   &gt;&gt;&gt; parseVersion "wrong"
--   Nothing
--   </pre>
--   
--   Whitespace is allowed.
--   
--   <pre>
--   &gt;&gt;&gt; parseVersion " 1.2.3 "
--   Just (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []})
--   </pre>
parseVersion :: String -> Maybe Version

-- | Attempts to parse a pre-release.
--   
--   <pre>
--   &gt;&gt;&gt; parsePreRelease "pre"
--   Just (PreReleaseTextual "pre")
--   
--   &gt;&gt;&gt; parsePreRelease "1"
--   Just (PreReleaseNumeric 1)
--   </pre>
--   
--   Returns <a>Nothing</a> if the parse fails.
--   
--   <pre>
--   &gt;&gt;&gt; parsePreRelease "wrong!"
--   Nothing
--   </pre>
--   
--   Numeric pre-releases cannot contain leading zeros.
--   
--   <pre>
--   &gt;&gt;&gt; parsePreRelease "01"
--   Nothing
--   </pre>
parsePreRelease :: String -> Maybe PreRelease

-- | Attempts to parse a build.
--   
--   <pre>
--   &gt;&gt;&gt; parseBuild "build"
--   Just (Build "build")
--   
--   &gt;&gt;&gt; parseBuild "1"
--   Just (Build "1")
--   </pre>
--   
--   Returns <a>Nothing</a> if the parse fails.
--   
--   <pre>
--   &gt;&gt;&gt; parseBuild "wrong!"
--   Nothing
--   </pre>
--   
--   Unlike pre-releases, numeric builds can have leading zeros.
--   
--   <pre>
--   &gt;&gt;&gt; parseBuild "01"
--   Just (Build "01")
--   </pre>
parseBuild :: String -> Maybe Build

-- | Attempts to parse a constraint. This parser mostly follows <a>npm's
--   BNF</a>.
--   
--   <pre>
--   &gt;&gt;&gt; parseConstraint "&gt;1.2.3"
--   Just (ConstraintOperator OperatorGT (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []}))
--   </pre>
--   
--   Returns <a>Nothing</a> if the parse fails.
--   
--   <pre>
--   &gt;&gt;&gt; parseConstraint "wrong"
--   Nothing
--   </pre>
--   
--   The two departures from npm's BNF are that x-ranges cannot be used
--   with other operators and partial version numbers are not allowed.
--   
--   <pre>
--   &gt;&gt;&gt; parseConstraint "1.2.x"
--   Just (ConstraintWildcard (WildcardPatch 1 2))
--   
--   &gt;&gt;&gt; parseConstraint "&gt;=1.2.x"
--   Nothing
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; parseConstraint "1.2"
--   Nothing
--   
--   &gt;&gt;&gt; parseConstraint "&gt;=1.2"
--   Nothing
--   </pre>
parseConstraint :: String -> Maybe Constraint

-- | Parses a version.
--   
--   <pre>
--   &gt;&gt;&gt; unsafeParseVersion "1.2.3-p.4+b.5"
--   Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [PreReleaseTextual "p",PreReleaseNumeric 4], versionBuilds = [Build "b",Build "5"]}
--   </pre>
--   
--   Raises an exception if the parse fails.
--   
--   <pre>
--   &gt;&gt;&gt; unsafeParseVersion "wrong"
--   *** Exception: unsafeParseVersion: invalid version: "wrong"
--   ...
--   </pre>
--   
--   See <a>parseVersion</a> for a safe version of this function.
unsafeParseVersion :: String -> Version

-- | Parses a pre-release.
--   
--   <pre>
--   &gt;&gt;&gt; unsafeParsePreRelease "pre"
--   PreReleaseTextual "pre"
--   </pre>
--   
--   Raises an exception if the parse fails.
--   
--   <pre>
--   &gt;&gt;&gt; unsafeParsePreRelease "wrong!"
--   *** Exception: unsafeParsePreRelease: invalid pre-release: "wrong!"
--   ...
--   </pre>
--   
--   See <a>parsePreRelease</a> for a safe version of this function.
unsafeParsePreRelease :: String -> PreRelease

-- | Parses a build.
--   
--   <pre>
--   &gt;&gt;&gt; unsafeParseBuild "build"
--   Build "build"
--   </pre>
--   
--   Raises an exception if the parse fails.
--   
--   <pre>
--   &gt;&gt;&gt; unsafeParseBuild "wrong!"
--   Build "*** Exception: unsafeParseBuild: invalid build: "wrong!"
--   ...
--   </pre>
--   
--   See <a>parseBuild</a> for a safe version of this function.
unsafeParseBuild :: String -> Build

-- | Parses a constraint.
--   
--   <pre>
--   &gt;&gt;&gt; unsafeParseConstraint "&gt;1.2.3"
--   ConstraintOperator OperatorGT (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []})
--   </pre>
--   
--   Raises an exception if the parse fails.
--   
--   <pre>
--   &gt;&gt;&gt; unsafeParseConstraint "wrong"
--   *** Exception: unsafeParseConstraint: invalid constraint: "wrong"
--   ...
--   </pre>
--   
--   See <a>parseConstraint</a> for a safe version of this function.
unsafeParseConstraint :: String -> Constraint

-- | Renders a version.
--   
--   <pre>
--   &gt;&gt;&gt; renderVersion &lt;$&gt; parseVersion "1.2.3-p.4+b.5"
--   Just "1.2.3-p.4+b.5"
--   </pre>
renderVersion :: Version -> String

-- | Renders a pre-release.
--   
--   <pre>
--   &gt;&gt;&gt; renderPreRelease &lt;$&gt; parsePreRelease "pre"
--   Just "pre"
--   
--   &gt;&gt;&gt; renderPreRelease &lt;$&gt; parsePreRelease "1"
--   Just "1"
--   </pre>
renderPreRelease :: PreRelease -> String

-- | Renders a build.
--   
--   <pre>
--   &gt;&gt;&gt; renderBuild &lt;$&gt; parseBuild "build"
--   Just "build"
--   
--   &gt;&gt;&gt; renderBuild &lt;$&gt; parseBuild "1"
--   Just "1"
--   </pre>
renderBuild :: Build -> String

-- | Renders a constraint.
--   
--   <pre>
--   &gt;&gt;&gt; renderConstraint &lt;$&gt; parseConstraint "&gt;1.2.3"
--   Just "&gt;1.2.3"
--   </pre>
--   
--   Parsing and rendering a constraint doesn't always return what you
--   started with.
--   
--   <pre>
--   &gt;&gt;&gt; renderConstraint &lt;$&gt; parseConstraint "=1.2.3"
--   Just "1.2.3"
--   </pre>
renderConstraint :: Constraint -> String

-- | Returns <a>True</a> if the major version number is zero, <a>False</a>
--   otherwise.
--   
--   <pre>
--   &gt;&gt;&gt; isUnstable &lt;$&gt; parseVersion "0.1.2"
--   Just True
--   
--   &gt;&gt;&gt; isUnstable &lt;$&gt; parseVersion "1.0.0"
--   Just False
--   </pre>
isUnstable :: Version -> Bool

-- | Returns <a>True</a> if the major version number is not zero,
--   <a>False</a> otherwise.
--   
--   <pre>
--   &gt;&gt;&gt; isStable &lt;$&gt; parseVersion "1.0.0"
--   Just True
--   
--   &gt;&gt;&gt; isStable &lt;$&gt; parseVersion "0.1.2"
--   Just False
--   </pre>
isStable :: Version -> Bool

-- | Converts from a <a>Version</a> from the <tt>base</tt> package.
--   
--   <pre>
--   &gt;&gt;&gt; renderVersion . fromBaseVersion $ Version.makeVersion [1, 2, 3]
--   "1.2.3"
--   </pre>
--   
--   Missing version components are set to zero.
--   
--   <pre>
--   &gt;&gt;&gt; renderVersion . fromBaseVersion $ Version.makeVersion []
--   "0.0.0"
--   
--   &gt;&gt;&gt; renderVersion . fromBaseVersion $ Version.makeVersion [1]
--   "1.0.0"
--   
--   &gt;&gt;&gt; renderVersion . fromBaseVersion $ Version.makeVersion [1, 2]
--   "1.2.0"
--   </pre>
--   
--   Extra version components are ignored.
--   
--   <pre>
--   &gt;&gt;&gt; renderVersion . fromBaseVersion $ Version.makeVersion [1, 2, 3, 4]
--   "1.2.3"
--   </pre>
--   
--   Tags are ignored.
--   
--   <pre>
--   &gt;&gt;&gt; renderVersion . fromBaseVersion $ Version.Version [] ["ignored"]
--   "0.0.0"
--   </pre>
fromBaseVersion :: Version -> Version

-- | Converts to a <a>Version</a> from the <tt>base</tt> package.
--   
--   <pre>
--   &gt;&gt;&gt; toBaseVersion &lt;$&gt; parseVersion "1.2.3"
--   Just (Version {versionBranch = [1,2,3], versionTags = []})
--   </pre>
--   
--   Pre-releases and builds are converted to tags.
--   
--   <pre>
--   &gt;&gt;&gt; toBaseVersion &lt;$&gt; parseVersion "1.2.3-pre+build"
--   Just (Version {versionBranch = [1,2,3], versionTags = ["pre","build"]})
--   </pre>
toBaseVersion :: Version -> Version

-- | Increments the major version number.
--   
--   <pre>
--   &gt;&gt;&gt; bumpMajor &lt;$&gt; parseVersion "0.0.0"
--   Just (Version {versionMajor = 1, versionMinor = 0, versionPatch = 0, versionPreReleases = [], versionBuilds = []})
--   </pre>
--   
--   The minor and patch numbers are reset to zero.
--   
--   <pre>
--   &gt;&gt;&gt; bumpMajor &lt;$&gt; parseVersion "1.2.3"
--   Just (Version {versionMajor = 2, versionMinor = 0, versionPatch = 0, versionPreReleases = [], versionBuilds = []})
--   </pre>
--   
--   The pre-releases and builds are removed.
--   
--   <pre>
--   &gt;&gt;&gt; bumpMajor &lt;$&gt; parseVersion "0.0.0-pre+build"
--   Just (Version {versionMajor = 1, versionMinor = 0, versionPatch = 0, versionPreReleases = [], versionBuilds = []})
--   </pre>
--   
--   Consider using <a>majorLens</a> if you want to arbitrarily change the
--   major number, or if you don't want the other parts of the version to
--   change.
bumpMajor :: Version -> Version

-- | Increments the minor version number.
--   
--   <pre>
--   &gt;&gt;&gt; bumpMinor &lt;$&gt; parseVersion "0.0.0"
--   Just (Version {versionMajor = 0, versionMinor = 1, versionPatch = 0, versionPreReleases = [], versionBuilds = []})
--   </pre>
--   
--   The patch number is reset to zero.
--   
--   <pre>
--   &gt;&gt;&gt; bumpMinor &lt;$&gt; parseVersion "1.2.3"
--   Just (Version {versionMajor = 1, versionMinor = 3, versionPatch = 0, versionPreReleases = [], versionBuilds = []})
--   </pre>
--   
--   The pre-releases and builds are removed.
--   
--   <pre>
--   &gt;&gt;&gt; bumpMinor &lt;$&gt; parseVersion "0.0.0-pre+build"
--   Just (Version {versionMajor = 0, versionMinor = 1, versionPatch = 0, versionPreReleases = [], versionBuilds = []})
--   </pre>
--   
--   Consider using <a>minorLens</a> if you want to arbitrarily change the
--   minor number, or if you don't want the other parts of the version to
--   change.
bumpMinor :: Version -> Version

-- | Increments the patch number.
--   
--   <pre>
--   &gt;&gt;&gt; bumpPatch &lt;$&gt; parseVersion "0.0.0"
--   Just (Version {versionMajor = 0, versionMinor = 0, versionPatch = 1, versionPreReleases = [], versionBuilds = []})
--   </pre>
--   
--   The major and minor numbers are not changed.
--   
--   <pre>
--   &gt;&gt;&gt; bumpPatch &lt;$&gt; parseVersion "1.2.3"
--   Just (Version {versionMajor = 1, versionMinor = 2, versionPatch = 4, versionPreReleases = [], versionBuilds = []})
--   </pre>
--   
--   The pre-releases and builds are removed.
--   
--   <pre>
--   &gt;&gt;&gt; bumpPatch &lt;$&gt; parseVersion "0.0.0-pre+build"
--   Just (Version {versionMajor = 0, versionMinor = 0, versionPatch = 1, versionPreReleases = [], versionBuilds = []})
--   </pre>
--   
--   Consider using <a>patchLens</a> if you want to arbitrarily change the
--   patch number, or if you don't want the other parts of the version to
--   change.
bumpPatch :: Version -> Version

-- | Returns <a>True</a> if the version satisfies the constraint,
--   <a>False</a> otherwise.
--   
--   <pre>
--   &gt;&gt;&gt; satisfiesConstraint &lt;$&gt; parseConstraint "&gt;1.2.0" &lt;*&gt; parseVersion "1.2.3"
--   Just True
--   </pre>
satisfiesConstraint :: Constraint -> Version -> Bool

-- | Focuses on the major version number.
--   
--   <pre>
--   &gt;&gt;&gt; view majorLens &lt;$&gt; parseVersion "1.2.3-pre.4+build.5"
--   Just 1
--   
--   &gt;&gt;&gt; set majorLens 4 &lt;$&gt; parseVersion "1.2.3"
--   Just (Version {versionMajor = 4, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []})
--   </pre>
majorLens :: Functor f => (Word64 -> f Word64) -> Version -> f Version

-- | Focuses on the minor version number.
--   
--   <pre>
--   &gt;&gt;&gt; view minorLens &lt;$&gt; parseVersion "1.2.3-pre.4+build.5"
--   Just 2
--   
--   &gt;&gt;&gt; set minorLens 4 &lt;$&gt; parseVersion "1.2.3"
--   Just (Version {versionMajor = 1, versionMinor = 4, versionPatch = 3, versionPreReleases = [], versionBuilds = []})
--   </pre>
minorLens :: Functor f => (Word64 -> f Word64) -> Version -> f Version

-- | Focuses on the patch version number.
--   
--   <pre>
--   &gt;&gt;&gt; view patchLens &lt;$&gt; parseVersion "1.2.3-pre.4+build.5"
--   Just 3
--   
--   &gt;&gt;&gt; set patchLens 4 &lt;$&gt; parseVersion "1.2.3"
--   Just (Version {versionMajor = 1, versionMinor = 2, versionPatch = 4, versionPreReleases = [], versionBuilds = []})
--   </pre>
patchLens :: Functor f => (Word64 -> f Word64) -> Version -> f Version

-- | Focuses on the pre-release identifiers.
--   
--   <pre>
--   &gt;&gt;&gt; view preReleasesLens &lt;$&gt; parseVersion "1.2.3-pre.4+build.5"
--   Just [PreReleaseTextual "pre",PreReleaseNumeric 4]
--   
--   &gt;&gt;&gt; set preReleasesLens [] &lt;$&gt; parseVersion "1.2.3-pre"
--   Just (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []})
--   </pre>
preReleasesLens :: Functor f => ([PreRelease] -> f [PreRelease]) -> Version -> f Version

-- | Focuses on the build metadata.
--   
--   <pre>
--   &gt;&gt;&gt; view buildsLens &lt;$&gt; parseVersion "1.2.3-pre.4+build.5"
--   Just [Build "build",Build "5"]
--   
--   &gt;&gt;&gt; set buildsLens [] &lt;$&gt; parseVersion "1.2.3+build"
--   Just (Version {versionMajor = 1, versionMinor = 2, versionPatch = 3, versionPreReleases = [], versionBuilds = []})
--   </pre>
buildsLens :: Functor f => ([Build] -> f [Build]) -> Version -> f Version
