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

module Data.SemanticVersion.IdentifierCharacter where

import Control.Applicative
import Control.Lens
import Data.Char.Alpha
import Data.Digit
import Data.SemanticVersion.NonDigit
import Text.Parser.Char

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

-- <identifier character> ::= <digit>
--                          | <non-digit>
data IdentifierCharacter =
  IdentifierCharacterDigit DecDigit
  | IdentifierCharacterNonDigit NonDigit
  deriving (IdentifierCharacter -> IdentifierCharacter -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: IdentifierCharacter -> IdentifierCharacter -> Bool
$c/= :: IdentifierCharacter -> IdentifierCharacter -> Bool
== :: IdentifierCharacter -> IdentifierCharacter -> Bool
$c== :: IdentifierCharacter -> IdentifierCharacter -> Bool
Eq, Int -> IdentifierCharacter -> ShowS
[IdentifierCharacter] -> ShowS
IdentifierCharacter -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [IdentifierCharacter] -> ShowS
$cshowList :: [IdentifierCharacter] -> ShowS
show :: IdentifierCharacter -> String
$cshow :: IdentifierCharacter -> String
showsPrec :: Int -> IdentifierCharacter -> ShowS
$cshowsPrec :: Int -> IdentifierCharacter -> ShowS
Show)

class HasIdentifierCharacter a where
  identifierCharacter ::
    Lens' a IdentifierCharacter

instance HasIdentifierCharacter IdentifierCharacter where
  identifierCharacter :: Lens' IdentifierCharacter IdentifierCharacter
identifierCharacter =
    forall a. a -> a
id

class AsIdentifierCharacter a where
  _IdentifierCharacter ::
    Prism' a IdentifierCharacter
  _IdentifierCharacterDigit ::
    Prism' a DecDigit
  _IdentifierCharacterDigit =
    forall a. AsIdentifierCharacter a => Prism' a IdentifierCharacter
_IdentifierCharacter forall b c a. (b -> c) -> (a -> b) -> a -> c
.
    forall b s a. (b -> s) -> (s -> Maybe a) -> Prism s s a b
prism'
      DecDigit -> IdentifierCharacter
IdentifierCharacterDigit
      (\case
          IdentifierCharacterDigit DecDigit
a ->
            forall a. a -> Maybe a
Just DecDigit
a
          IdentifierCharacter
_ ->
            forall a. Maybe a
Nothing)

instance AsIdentifierCharacter IdentifierCharacter where
  _IdentifierCharacter :: Prism' IdentifierCharacter IdentifierCharacter
_IdentifierCharacter =
    forall a. a -> a
id

instance AsNonDigit IdentifierCharacter where
  _NonDigit :: Prism' IdentifierCharacter NonDigit
_NonDigit =
    forall b s a. (b -> s) -> (s -> Maybe a) -> Prism s s a b
prism'
      NonDigit -> IdentifierCharacter
IdentifierCharacterNonDigit
      (\case
          IdentifierCharacterNonDigit NonDigit
a ->
            forall a. a -> Maybe a
Just NonDigit
a
          IdentifierCharacter
_ ->
            forall a. Maybe a
Nothing)

instance CA IdentifierCharacter where _A' :: Prism' IdentifierCharacter ()
_A' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. CA x => Prism' x ()
_A'
instance CB IdentifierCharacter where _B' :: Prism' IdentifierCharacter ()
_B' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. CB x => Prism' x ()
_B'
instance CC IdentifierCharacter where _C' :: Prism' IdentifierCharacter ()
_C' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. CC x => Prism' x ()
_C'
instance CD IdentifierCharacter where _D' :: Prism' IdentifierCharacter ()
_D' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. CD x => Prism' x ()
_D'
instance CE IdentifierCharacter where _E' :: Prism' IdentifierCharacter ()
_E' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. CE x => Prism' x ()
_E'
instance CF IdentifierCharacter where _F' :: Prism' IdentifierCharacter ()
_F' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. CF x => Prism' x ()
_F'
instance CG IdentifierCharacter where _G' :: Prism' IdentifierCharacter ()
_G' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. CG x => Prism' x ()
_G'
instance CH IdentifierCharacter where _H' :: Prism' IdentifierCharacter ()
_H' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. CH x => Prism' x ()
_H'
instance CI IdentifierCharacter where _I' :: Prism' IdentifierCharacter ()
_I' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. CI x => Prism' x ()
_I'
instance CJ IdentifierCharacter where _J' :: Prism' IdentifierCharacter ()
_J' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. CJ x => Prism' x ()
_J'
instance CK IdentifierCharacter where _K' :: Prism' IdentifierCharacter ()
_K' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. CK x => Prism' x ()
_K'
instance CL IdentifierCharacter where _L' :: Prism' IdentifierCharacter ()
_L' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. CL x => Prism' x ()
_L'
instance CM IdentifierCharacter where _M' :: Prism' IdentifierCharacter ()
_M' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. CM x => Prism' x ()
_M'
instance CN IdentifierCharacter where _N' :: Prism' IdentifierCharacter ()
_N' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. CN x => Prism' x ()
_N'
instance CO IdentifierCharacter where _O' :: Prism' IdentifierCharacter ()
_O' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. CO x => Prism' x ()
_O'
instance CP IdentifierCharacter where _P' :: Prism' IdentifierCharacter ()
_P' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. CP x => Prism' x ()
_P'
instance CQ IdentifierCharacter where _Q' :: Prism' IdentifierCharacter ()
_Q' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. CQ x => Prism' x ()
_Q'
instance CR IdentifierCharacter where _R' :: Prism' IdentifierCharacter ()
_R' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. CR x => Prism' x ()
_R'
instance CS IdentifierCharacter where _S' :: Prism' IdentifierCharacter ()
_S' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. CS x => Prism' x ()
_S'
instance CT IdentifierCharacter where _T' :: Prism' IdentifierCharacter ()
_T' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. CT x => Prism' x ()
_T'
instance CU IdentifierCharacter where _U' :: Prism' IdentifierCharacter ()
_U' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. CU x => Prism' x ()
_U'
instance CV IdentifierCharacter where _V' :: Prism' IdentifierCharacter ()
_V' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. CV x => Prism' x ()
_V'
instance CW IdentifierCharacter where _W' :: Prism' IdentifierCharacter ()
_W' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. CW x => Prism' x ()
_W'
instance CX IdentifierCharacter where _X' :: Prism' IdentifierCharacter ()
_X' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. CX x => Prism' x ()
_X'
instance CY IdentifierCharacter where _Y' :: Prism' IdentifierCharacter ()
_Y' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. CY x => Prism' x ()
_Y'
instance CZ IdentifierCharacter where _Z' :: Prism' IdentifierCharacter ()
_Z' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. CZ x => Prism' x ()
_Z'
instance Ca IdentifierCharacter where _a' :: Prism' IdentifierCharacter ()
_a' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. Ca x => Prism' x ()
_a'
instance Cb IdentifierCharacter where _b' :: Prism' IdentifierCharacter ()
_b' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. Cb x => Prism' x ()
_b'
instance Cc IdentifierCharacter where _c' :: Prism' IdentifierCharacter ()
_c' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. Cc x => Prism' x ()
_c'
instance Cd IdentifierCharacter where _d' :: Prism' IdentifierCharacter ()
_d' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. Cd x => Prism' x ()
_d'
instance Ce IdentifierCharacter where _e' :: Prism' IdentifierCharacter ()
_e' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. Ce x => Prism' x ()
_e'
instance Cf IdentifierCharacter where _f' :: Prism' IdentifierCharacter ()
_f' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. Cf x => Prism' x ()
_f'
instance Cg IdentifierCharacter where _g' :: Prism' IdentifierCharacter ()
_g' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. Cg x => Prism' x ()
_g'
instance Ch IdentifierCharacter where _h' :: Prism' IdentifierCharacter ()
_h' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. Ch x => Prism' x ()
_h'
instance Ci IdentifierCharacter where _i' :: Prism' IdentifierCharacter ()
_i' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. Ci x => Prism' x ()
_i'
instance Cj IdentifierCharacter where _j' :: Prism' IdentifierCharacter ()
_j' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. Cj x => Prism' x ()
_j'
instance Ck IdentifierCharacter where _k' :: Prism' IdentifierCharacter ()
_k' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. Ck x => Prism' x ()
_k'
instance Cl IdentifierCharacter where _l' :: Prism' IdentifierCharacter ()
_l' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. Cl x => Prism' x ()
_l'
instance Cm IdentifierCharacter where _m' :: Prism' IdentifierCharacter ()
_m' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. Cm x => Prism' x ()
_m'
instance Cn IdentifierCharacter where _n' :: Prism' IdentifierCharacter ()
_n' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. Cn x => Prism' x ()
_n'
instance Co IdentifierCharacter where _o' :: Prism' IdentifierCharacter ()
_o' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. Co x => Prism' x ()
_o'
instance Cp IdentifierCharacter where _p' :: Prism' IdentifierCharacter ()
_p' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. Cp x => Prism' x ()
_p'
instance Cq IdentifierCharacter where _q' :: Prism' IdentifierCharacter ()
_q' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. Cq x => Prism' x ()
_q'
instance Cr IdentifierCharacter where _r' :: Prism' IdentifierCharacter ()
_r' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. Cr x => Prism' x ()
_r'
instance Cs IdentifierCharacter where _s' :: Prism' IdentifierCharacter ()
_s' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. Cs x => Prism' x ()
_s'
instance Ct IdentifierCharacter where _t' :: Prism' IdentifierCharacter ()
_t' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. Ct x => Prism' x ()
_t'
instance Cu IdentifierCharacter where _u' :: Prism' IdentifierCharacter ()
_u' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. Cu x => Prism' x ()
_u'
instance Cv IdentifierCharacter where _v' :: Prism' IdentifierCharacter ()
_v' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. Cv x => Prism' x ()
_v'
instance Cw IdentifierCharacter where _w' :: Prism' IdentifierCharacter ()
_w' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. Cw x => Prism' x ()
_w'
instance Cx IdentifierCharacter where _x' :: Prism' IdentifierCharacter ()
_x' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. Cx x => Prism' x ()
_x'
instance Cy IdentifierCharacter where _y' :: Prism' IdentifierCharacter ()
_y' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. Cy x => Prism' x ()
_y'
instance Cz IdentifierCharacter where _z' :: Prism' IdentifierCharacter ()
_z' = forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. Cz x => Prism' x ()
_z'
instance D0 IdentifierCharacter where d0 :: Prism' IdentifierCharacter ()
d0 = forall a. AsIdentifierCharacter a => Prism' a DecDigit
_IdentifierCharacterDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall d. D0 d => Prism' d ()
d0
instance D1 IdentifierCharacter where d1 :: Prism' IdentifierCharacter ()
d1 = forall a. AsIdentifierCharacter a => Prism' a DecDigit
_IdentifierCharacterDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall d. D1 d => Prism' d ()
d1
instance D2 IdentifierCharacter where d2 :: Prism' IdentifierCharacter ()
d2 = forall a. AsIdentifierCharacter a => Prism' a DecDigit
_IdentifierCharacterDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall d. D2 d => Prism' d ()
d2
instance D3 IdentifierCharacter where d3 :: Prism' IdentifierCharacter ()
d3 = forall a. AsIdentifierCharacter a => Prism' a DecDigit
_IdentifierCharacterDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall d. D3 d => Prism' d ()
d3
instance D4 IdentifierCharacter where d4 :: Prism' IdentifierCharacter ()
d4 = forall a. AsIdentifierCharacter a => Prism' a DecDigit
_IdentifierCharacterDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall d. D4 d => Prism' d ()
d4
instance D5 IdentifierCharacter where d5 :: Prism' IdentifierCharacter ()
d5 = forall a. AsIdentifierCharacter a => Prism' a DecDigit
_IdentifierCharacterDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall d. D5 d => Prism' d ()
d5
instance D6 IdentifierCharacter where d6 :: Prism' IdentifierCharacter ()
d6 = forall a. AsIdentifierCharacter a => Prism' a DecDigit
_IdentifierCharacterDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall d. D6 d => Prism' d ()
d6
instance D7 IdentifierCharacter where d7 :: Prism' IdentifierCharacter ()
d7 = forall a. AsIdentifierCharacter a => Prism' a DecDigit
_IdentifierCharacterDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall d. D7 d => Prism' d ()
d7
instance D8 IdentifierCharacter where d8 :: Prism' IdentifierCharacter ()
d8 = forall a. AsIdentifierCharacter a => Prism' a DecDigit
_IdentifierCharacterDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall d. D8 d => Prism' d ()
d8
instance D9 IdentifierCharacter where d9 :: Prism' IdentifierCharacter ()
d9 = forall a. AsIdentifierCharacter a => Prism' a DecDigit
_IdentifierCharacterDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall d. D9 d => Prism' d ()
d9

-- |
--
-- >>> parse (parseIdentifierCharacter <* eof) "parseIdentifierCharacter" "a"
-- Right (IdentifierCharacterNonDigit (NonDigitLetter (AlphaLower Lower_a)))
--
-- >>> isLeft (parse parseIdentifierCharacter "parseIdentifierCharacter" "")
-- True
--
-- >>> parse parseIdentifierCharacter "parseIdentifierCharacter" "Abc"
-- Right (IdentifierCharacterNonDigit (NonDigitLetter (AlphaUpper Upper_A)))
--
-- >>> parse (parseIdentifierCharacter <* eof) "parseIdentifierCharacter" "-"
-- Right (IdentifierCharacterNonDigit NonDigitHyphen)
--
-- >>> parse (parseIdentifierCharacter <* eof) "parseIdentifierCharacter" "0"
-- Right (IdentifierCharacterDigit DecDigit0)
--
-- >>> parse (parseIdentifierCharacter <* eof) "parseIdentifierCharacter" "9"
-- Right (IdentifierCharacterDigit DecDigit9)
--
-- >>> isLeft (parse parseIdentifierCharacter "parseIdentifierCharacter" "+")
-- True
--
-- >>> isLeft (parse parseIdentifierCharacter "parseIdentifierCharacter" "")
-- True
--
-- >>> parse parseIdentifierCharacter "parseIdentifierCharacter" "01"
-- Right (IdentifierCharacterDigit DecDigit0)
--
-- >>> parse parseIdentifierCharacter "parseIdentifierCharacter" "10"
-- Right (IdentifierCharacterDigit DecDigit1)
--
-- >>> parse parseIdentifierCharacter "parseIdentifierCharacter" "38012"
-- Right (IdentifierCharacterDigit DecDigit3)
--
-- >>> parse (parseIdentifierCharacter <* eof) "parseIdentifierCharacter" "a"
-- Right (IdentifierCharacterNonDigit (NonDigitLetter (AlphaLower Lower_a)))
parseIdentifierCharacter ::
  CharParsing p =>
  p IdentifierCharacter
parseIdentifierCharacter :: forall (p :: * -> *). CharParsing p => p IdentifierCharacter
parseIdentifierCharacter =
  DecDigit -> IdentifierCharacter
IdentifierCharacterDigit forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall d (p :: * -> *). (Decimal d, CharParsing p) => p d
parseDecimal forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
  NonDigit -> IdentifierCharacter
IdentifierCharacterNonDigit forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (p :: * -> *). CharParsing p => p NonDigit
parseNonDigit