{-# OPTIONS_GHC -Wall #-}

module Data.SemanticVersion.Version where

import Control.Lens
import Data.SemanticVersion.NumericIdentifier
import Text.Parser.Char

-- $setup
-- >>> import Text.Parsec(parse)
-- >>> import Data.Either(isLeft)

-- <version core> ::= <major> "." <minor> "." <patch>
data Version =
  Version NumericIdentifier NumericIdentifier NumericIdentifier
  deriving (Version -> Version -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Version -> Version -> Bool
$c/= :: Version -> Version -> Bool
== :: Version -> Version -> Bool
$c== :: Version -> Version -> Bool
Eq, Int -> Version -> ShowS
[Version] -> ShowS
Version -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Version] -> ShowS
$cshowList :: [Version] -> ShowS
show :: Version -> String
$cshow :: Version -> String
showsPrec :: Int -> Version -> ShowS
$cshowsPrec :: Int -> Version -> ShowS
Show)

class HasVersion a where
  version ::
    Lens' a Version
  versionMajor ::
    Lens' a NumericIdentifier
  versionMajor =
    forall a. HasVersion a => Lens' a Version
version forall b c a. (b -> c) -> (a -> b) -> a -> c
. \NumericIdentifier -> f NumericIdentifier
f (Version NumericIdentifier
j NumericIdentifier
n NumericIdentifier
p) -> forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\NumericIdentifier
j' -> NumericIdentifier
-> NumericIdentifier -> NumericIdentifier -> Version
Version NumericIdentifier
j' NumericIdentifier
n NumericIdentifier
p) (NumericIdentifier -> f NumericIdentifier
f NumericIdentifier
j)
  versionMinor ::
    Lens' a NumericIdentifier
  versionMinor =
    forall a. HasVersion a => Lens' a Version
version forall b c a. (b -> c) -> (a -> b) -> a -> c
. \NumericIdentifier -> f NumericIdentifier
f (Version NumericIdentifier
j NumericIdentifier
n NumericIdentifier
p) -> forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\NumericIdentifier
n' -> NumericIdentifier
-> NumericIdentifier -> NumericIdentifier -> Version
Version NumericIdentifier
j NumericIdentifier
n' NumericIdentifier
p) (NumericIdentifier -> f NumericIdentifier
f NumericIdentifier
n)
  versionPatch ::
    Lens' a NumericIdentifier
  versionPatch =
    forall a. HasVersion a => Lens' a Version
version forall b c a. (b -> c) -> (a -> b) -> a -> c
. \NumericIdentifier -> f NumericIdentifier
f (Version NumericIdentifier
j NumericIdentifier
n NumericIdentifier
p) -> forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (NumericIdentifier
-> NumericIdentifier -> NumericIdentifier -> Version
Version NumericIdentifier
j NumericIdentifier
n) (NumericIdentifier -> f NumericIdentifier
f NumericIdentifier
p)

instance HasVersion Version where
  version :: Lens' Version Version
version =
    forall a. a -> a
id

class AsVersion a where
  _Version ::
    Prism' a Version

instance AsVersion Version where
  _Version :: Prism' Version Version
_Version =
    forall a. a -> a
id

-- |
--
-- >>> parse (parseVersion <* eof) "parseVersion" "0.0.0"
-- Right (Version NumericIdentifierZero NumericIdentifierZero NumericIdentifierZero)
--
-- >>> isLeft (parse parseVersion "parseVersion" "")
-- True
--
-- >>> parse (parseVersion <* eof) "parseVersion" "1.2.3"
-- Right (Version (NumericIdentifierDigits DecDigitNoZero1 []) (NumericIdentifierDigits DecDigitNoZero2 []) (NumericIdentifierDigits DecDigitNoZero3 []))
--
-- >>> isLeft(parse parseVersion "parseVersion" "01.2.3")
-- True
--
-- >>> parse (parseVersion <* eof) "parseVersion" "10.2.3"
-- Right (Version (NumericIdentifierDigits DecDigitNoZero1 [DecDigit0]) (NumericIdentifierDigits DecDigitNoZero2 []) (NumericIdentifierDigits DecDigitNoZero3 []))
--
-- >>> parse (parseVersion <* eof) "parseVersion" "38012.5.6"
-- Right (Version (NumericIdentifierDigits DecDigitNoZero3 [DecDigit8,DecDigit0,DecDigit1,DecDigit2]) (NumericIdentifierDigits DecDigitNoZero5 []) (NumericIdentifierDigits DecDigitNoZero6 []))
--
-- >>> parse (parseVersion <* eof) "parseVersion" "38012.5.5432"
-- Right (Version (NumericIdentifierDigits DecDigitNoZero3 [DecDigit8,DecDigit0,DecDigit1,DecDigit2]) (NumericIdentifierDigits DecDigitNoZero5 []) (NumericIdentifierDigits DecDigitNoZero5 [DecDigit4,DecDigit3,DecDigit2]))
--
-- >>> isLeft (parse (parseVersion <* eof) "parseVersion" "38012.05.5432")
-- True
--
-- >>> isLeft (parse (parseVersion <* eof) "parseVersion" "38012.5.05432")
-- True
--
-- >>> isLeft (parse parseVersion "parseVersion" "a")
-- True
--
-- >>> isLeft (parse parseVersion "parseVersion" "-")
-- True
parseVersion ::
  CharParsing p =>
  p Version
parseVersion :: forall (p :: * -> *). CharParsing p => p Version
parseVersion =
  NumericIdentifier
-> NumericIdentifier -> NumericIdentifier -> Version
Version forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (p :: * -> *). CharParsing p => p NumericIdentifier
parseNumericIdentifier forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall (m :: * -> *). CharParsing m => Char -> m Char
char Char
'.' forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (p :: * -> *). CharParsing p => p NumericIdentifier
parseNumericIdentifier forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall (m :: * -> *). CharParsing m => Char -> m Char
char Char
'.' forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (p :: * -> *). CharParsing p => p NumericIdentifier
parseNumericIdentifier