{-# OPTIONS_GHC -Wall #-}
{-# LANGUAGE LambdaCase #-}

module Data.SemanticVersion.PreReleaseIdentifier where

import Control.Applicative
import Control.Lens
import Data.SemanticVersion.AlphanumericIdentifier
import Data.SemanticVersion.NumericIdentifier
import Text.Parser.Char
import Text.Parser.Combinators

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

-- <pre-release identifier> ::= <alphanumeric identifier>
--                            | <numeric identifier>
data PreReleaseIdentifier =
  PreReleaseIdentifierAlphanumeric AlphanumericIdentifier
  | PreReleaseIdentifierNumeric NumericIdentifier
  deriving (PreReleaseIdentifier -> PreReleaseIdentifier -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PreReleaseIdentifier -> PreReleaseIdentifier -> Bool
$c/= :: PreReleaseIdentifier -> PreReleaseIdentifier -> Bool
== :: PreReleaseIdentifier -> PreReleaseIdentifier -> Bool
$c== :: PreReleaseIdentifier -> PreReleaseIdentifier -> Bool
Eq, Int -> PreReleaseIdentifier -> ShowS
[PreReleaseIdentifier] -> ShowS
PreReleaseIdentifier -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PreReleaseIdentifier] -> ShowS
$cshowList :: [PreReleaseIdentifier] -> ShowS
show :: PreReleaseIdentifier -> String
$cshow :: PreReleaseIdentifier -> String
showsPrec :: Int -> PreReleaseIdentifier -> ShowS
$cshowsPrec :: Int -> PreReleaseIdentifier -> ShowS
Show)

class HasPreReleaseIdentifier a where
  preReleaseIdentifier ::
    Lens' a PreReleaseIdentifier

instance HasPreReleaseIdentifier PreReleaseIdentifier where
  preReleaseIdentifier :: Lens' PreReleaseIdentifier PreReleaseIdentifier
preReleaseIdentifier =
    forall a. a -> a
id

class AsPreReleaseIdentifier a where
  _PreReleaseIdentifier ::
    Prism' a PreReleaseIdentifier

instance AsPreReleaseIdentifier PreReleaseIdentifier where
  _PreReleaseIdentifier :: Prism' PreReleaseIdentifier PreReleaseIdentifier
_PreReleaseIdentifier =
    forall a. a -> a
id

instance AsAlphanumericIdentifier PreReleaseIdentifier where
  _AlphanumericIdentifier :: Prism' PreReleaseIdentifier AlphanumericIdentifier
_AlphanumericIdentifier =
    forall b s a. (b -> s) -> (s -> Maybe a) -> Prism s s a b
prism'
      AlphanumericIdentifier -> PreReleaseIdentifier
PreReleaseIdentifierAlphanumeric
      (\case
        PreReleaseIdentifierAlphanumeric AlphanumericIdentifier
a ->
          forall a. a -> Maybe a
Just AlphanumericIdentifier
a
        PreReleaseIdentifier
_ ->
          forall a. Maybe a
Nothing)

instance AsNumericIdentifier PreReleaseIdentifier where
  _NumericIdentifier :: Prism' PreReleaseIdentifier NumericIdentifier
_NumericIdentifier =
    forall b s a. (b -> s) -> (s -> Maybe a) -> Prism s s a b
prism'
      NumericIdentifier -> PreReleaseIdentifier
PreReleaseIdentifierNumeric
      (\case
        PreReleaseIdentifierNumeric NumericIdentifier
a ->
          forall a. a -> Maybe a
Just NumericIdentifier
a
        PreReleaseIdentifier
_ ->
          forall a. Maybe a
Nothing)

-- |
--
-- >>> parse (parsePreReleaseIdentifier <* eof) "parsePreReleaseIdentifier" "A"
-- Right (PreReleaseIdentifierAlphanumeric (AlphanumericIdentifierNonDigit (NonDigitLetter (AlphaUpper Upper_A))))
--
-- >>> isLeft (parse parsePreReleaseIdentifier "parsePreReleaseIdentifier" "")
-- True
--
-- >>> parse (parsePreReleaseIdentifier <* eof) "parsePreReleaseIdentifier" "Abc-123--XYZ"
-- Right (PreReleaseIdentifierAlphanumeric (AlphanumericIdentifierNonDigits (NonDigitLetter (AlphaUpper Upper_A)) (IdentifierCharacters (IdentifierCharacterNonDigit (NonDigitLetter (AlphaLower Lower_b)) :| [IdentifierCharacterNonDigit (NonDigitLetter (AlphaLower Lower_c)),IdentifierCharacterNonDigit NonDigitHyphen,IdentifierCharacterDigit DecDigit1,IdentifierCharacterDigit DecDigit2,IdentifierCharacterDigit DecDigit3,IdentifierCharacterNonDigit NonDigitHyphen,IdentifierCharacterNonDigit NonDigitHyphen,IdentifierCharacterNonDigit (NonDigitLetter (AlphaUpper Upper_X)),IdentifierCharacterNonDigit (NonDigitLetter (AlphaUpper Upper_Y)),IdentifierCharacterNonDigit (NonDigitLetter (AlphaUpper Upper_Z))]))))
--
-- >>> isLeft (parse parsePreReleaseIdentifier "parsePreReleaseIdentifier" "+")
-- True
parsePreReleaseIdentifier ::
  CharParsing p =>
  p PreReleaseIdentifier
parsePreReleaseIdentifier :: forall (p :: * -> *). CharParsing p => p PreReleaseIdentifier
parsePreReleaseIdentifier =
  forall (m :: * -> *) a. Parsing m => m a -> m a
try (AlphanumericIdentifier -> PreReleaseIdentifier
PreReleaseIdentifierAlphanumeric forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (p :: * -> *). CharParsing p => p AlphanumericIdentifier
parseAlphanumericIdentifier) forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
  NumericIdentifier -> PreReleaseIdentifier
PreReleaseIdentifierNumeric forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (p :: * -> *). CharParsing p => p NumericIdentifier
parseNumericIdentifier