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

module Data.SemanticVersion.NonDigit where

import Control.Applicative
import Control.Lens
import Data.Char.Alpha
import Text.Parser.Char

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

-- <non-digit> ::= <letter>
--               | "-"
data NonDigit =
  NonDigitHyphen
  | NonDigitLetter Alpha
  deriving (NonDigit -> NonDigit -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: NonDigit -> NonDigit -> Bool
$c/= :: NonDigit -> NonDigit -> Bool
== :: NonDigit -> NonDigit -> Bool
$c== :: NonDigit -> NonDigit -> Bool
Eq, Int -> NonDigit -> ShowS
[NonDigit] -> ShowS
NonDigit -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [NonDigit] -> ShowS
$cshowList :: [NonDigit] -> ShowS
show :: NonDigit -> String
$cshow :: NonDigit -> String
showsPrec :: Int -> NonDigit -> ShowS
$cshowsPrec :: Int -> NonDigit -> ShowS
Show)

class HasNonDigit a where
  nonDigit ::
    Lens' a NonDigit

instance HasNonDigit NonDigit where
  nonDigit :: Lens' NonDigit NonDigit
nonDigit =
    forall a. a -> a
id

class AsNonDigit a where
  _NonDigit ::
    Prism' a NonDigit
  _NonDigitHyphen ::
    Prism' a ()
  _NonDigitHyphen =
    forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit 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'
      (\() -> NonDigit
NonDigitHyphen)
      (\case
        NonDigit
NonDigitHyphen ->
          forall a. a -> Maybe a
Just ()
        NonDigit
_ ->
          forall a. Maybe a
Nothing)
  _NonDigitLetter ::
    Prism' a Alpha
  _NonDigitLetter =
    forall a. AsNonDigit a => Prism' a NonDigit
_NonDigit 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'
      Alpha -> NonDigit
NonDigitLetter
      (\case
        NonDigitLetter Alpha
a ->
          forall a. a -> Maybe a
Just Alpha
a
        NonDigit
_ ->
          forall a. Maybe a
Nothing)

instance AsNonDigit NonDigit where
  _NonDigit :: Prism' NonDigit NonDigit
_NonDigit =
    forall a. a -> a
id

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

-- |
--
-- >>> parse parseNonDigit "parseNonDigit" "a"
-- Right (NonDigitLetter (AlphaLower Lower_a))
--
-- >>> isLeft (parse parseNonDigit "parseNonDigit" "")
-- True
--
-- >>> parse parseIdentifierCharacter "parseNonDigit" "Abc"
-- Right (IdentifierCharacterNonDigit (NonDigitLetter (AlphaUpper Upper_A)))
--
-- >>> parse parseIdentifierCharacter "parseNonDigit" "0"
-- Right (IdentifierCharacterDigit DecDigit0)
--
-- >>> parse parseIdentifierCharacter "parseNonDigit" "-"
-- Right (IdentifierCharacterNonDigit NonDigitHyphen)
--
-- >>> isLeft (parse parseNonDigit "parseNonDigit" "+")
-- True
--
-- >>> isLeft (parse parseNonDigit "parseNonDigit" "9")
-- True
parseNonDigit ::
  CharParsing p =>
  p NonDigit
parseNonDigit :: forall (p :: * -> *). CharParsing p => p NonDigit
parseNonDigit =
  Alpha -> NonDigit
NonDigitLetter forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall x (p :: * -> *). (IsAlpha x, CharParsing p) => p x
parse_alpha forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
  NonDigit
NonDigitHyphen forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ forall (m :: * -> *). CharParsing m => Char -> m Char
char Char
'-'