{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE TemplateHaskell #-}

module Data.Digit.Hexadecimal.MixedCase(
  HeXDigit(..)
, HeXaDeCiMaLNoZero
, HeXaDeCiMaL
, parseHeXaDeCiMaLNoZero
, parseHeXaDeCiMaL
-- * Prisms
, _HeXDigit0
, _HeXDigit1
, _HeXDigit2
, _HeXDigit3
, _HeXDigit4
, _HeXDigit5
, _HeXDigit6
, _HeXDigit7
, _HeXDigit8
, _HeXDigit9
, _HeXDigita
, _HeXDigitb
, _HeXDigitc
, _HeXDigitd
, _HeXDigite
, _HeXDigitf
, _HeXDigitA
, _HeXDigitB
, _HeXDigitC
, _HeXDigitD
, _HeXDigitE
, _HeXDigitF
-- * Re-exports
, module Data.Digit.Class.D0
, module Data.Digit.Class.D1
, module Data.Digit.Class.D2
, module Data.Digit.Class.D3
, module Data.Digit.Class.D4
, module Data.Digit.Class.D5
, module Data.Digit.Class.D6
, module Data.Digit.Class.D7
, module Data.Digit.Class.D8
, module Data.Digit.Class.D9
, module Data.Digit.Class.MixedCase
) where

import Prelude (Eq, Show, Ord)
import Control.Lens.TH (makePrisms)
import Text.Parser.Char(CharParsing)
import Text.Parser.Combinators((<?>), choice)
import Data.Digit.Class.D0
import Data.Digit.Class.D1
import Data.Digit.Class.D2
import Data.Digit.Class.D3
import Data.Digit.Class.D4
import Data.Digit.Class.D5
import Data.Digit.Class.D6
import Data.Digit.Class.D7
import Data.Digit.Class.D8
import Data.Digit.Class.D9
import Data.Digit.Class.MixedCase
import Data.Digit.Decimal(parseDecimalNoZero)

data HeXDigit
  = HeXDigit0
  | HeXDigit1
  | HeXDigit2
  | HeXDigit3
  | HeXDigit4
  | HeXDigit5
  | HeXDigit6
  | HeXDigit7
  | HeXDigit8
  | HeXDigit9
  | HeXDigita
  | HeXDigitb
  | HeXDigitc
  | HeXDigitd
  | HeXDigite
  | HeXDigitf
  | HeXDigitA
  | HeXDigitB
  | HeXDigitC
  | HeXDigitD
  | HeXDigitE
  | HeXDigitF
  deriving (Int -> HeXDigit -> ShowS
[HeXDigit] -> ShowS
HeXDigit -> String
(Int -> HeXDigit -> ShowS)
-> (HeXDigit -> String) -> ([HeXDigit] -> ShowS) -> Show HeXDigit
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [HeXDigit] -> ShowS
$cshowList :: [HeXDigit] -> ShowS
show :: HeXDigit -> String
$cshow :: HeXDigit -> String
showsPrec :: Int -> HeXDigit -> ShowS
$cshowsPrec :: Int -> HeXDigit -> ShowS
Show, HeXDigit -> HeXDigit -> Bool
(HeXDigit -> HeXDigit -> Bool)
-> (HeXDigit -> HeXDigit -> Bool) -> Eq HeXDigit
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: HeXDigit -> HeXDigit -> Bool
$c/= :: HeXDigit -> HeXDigit -> Bool
== :: HeXDigit -> HeXDigit -> Bool
$c== :: HeXDigit -> HeXDigit -> Bool
Eq, Eq HeXDigit
Eq HeXDigit
-> (HeXDigit -> HeXDigit -> Ordering)
-> (HeXDigit -> HeXDigit -> Bool)
-> (HeXDigit -> HeXDigit -> Bool)
-> (HeXDigit -> HeXDigit -> Bool)
-> (HeXDigit -> HeXDigit -> Bool)
-> (HeXDigit -> HeXDigit -> HeXDigit)
-> (HeXDigit -> HeXDigit -> HeXDigit)
-> Ord HeXDigit
HeXDigit -> HeXDigit -> Bool
HeXDigit -> HeXDigit -> Ordering
HeXDigit -> HeXDigit -> HeXDigit
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: HeXDigit -> HeXDigit -> HeXDigit
$cmin :: HeXDigit -> HeXDigit -> HeXDigit
max :: HeXDigit -> HeXDigit -> HeXDigit
$cmax :: HeXDigit -> HeXDigit -> HeXDigit
>= :: HeXDigit -> HeXDigit -> Bool
$c>= :: HeXDigit -> HeXDigit -> Bool
> :: HeXDigit -> HeXDigit -> Bool
$c> :: HeXDigit -> HeXDigit -> Bool
<= :: HeXDigit -> HeXDigit -> Bool
$c<= :: HeXDigit -> HeXDigit -> Bool
< :: HeXDigit -> HeXDigit -> Bool
$c< :: HeXDigit -> HeXDigit -> Bool
compare :: HeXDigit -> HeXDigit -> Ordering
$ccompare :: HeXDigit -> HeXDigit -> Ordering
$cp1Ord :: Eq HeXDigit
Ord)

makePrisms ''HeXDigit

instance D0 HeXDigit where; d0 :: p () (f ()) -> p HeXDigit (f HeXDigit)
d0 = p () (f ()) -> p HeXDigit (f HeXDigit)
Prism' HeXDigit ()
_HeXDigit0
instance D1 HeXDigit where; d1 :: p () (f ()) -> p HeXDigit (f HeXDigit)
d1 = p () (f ()) -> p HeXDigit (f HeXDigit)
Prism' HeXDigit ()
_HeXDigit1
instance D2 HeXDigit where; d2 :: p () (f ()) -> p HeXDigit (f HeXDigit)
d2 = p () (f ()) -> p HeXDigit (f HeXDigit)
Prism' HeXDigit ()
_HeXDigit2
instance D3 HeXDigit where; d3 :: p () (f ()) -> p HeXDigit (f HeXDigit)
d3 = p () (f ()) -> p HeXDigit (f HeXDigit)
Prism' HeXDigit ()
_HeXDigit3
instance D4 HeXDigit where; d4 :: p () (f ()) -> p HeXDigit (f HeXDigit)
d4 = p () (f ()) -> p HeXDigit (f HeXDigit)
Prism' HeXDigit ()
_HeXDigit4
instance D5 HeXDigit where; d5 :: p () (f ()) -> p HeXDigit (f HeXDigit)
d5 = p () (f ()) -> p HeXDigit (f HeXDigit)
Prism' HeXDigit ()
_HeXDigit5
instance D6 HeXDigit where; d6 :: p () (f ()) -> p HeXDigit (f HeXDigit)
d6 = p () (f ()) -> p HeXDigit (f HeXDigit)
Prism' HeXDigit ()
_HeXDigit6
instance D7 HeXDigit where; d7 :: p () (f ()) -> p HeXDigit (f HeXDigit)
d7 = p () (f ()) -> p HeXDigit (f HeXDigit)
Prism' HeXDigit ()
_HeXDigit7
instance D8 HeXDigit where; d8 :: p () (f ()) -> p HeXDigit (f HeXDigit)
d8 = p () (f ()) -> p HeXDigit (f HeXDigit)
Prism' HeXDigit ()
_HeXDigit8
instance D9 HeXDigit where; d9 :: p () (f ()) -> p HeXDigit (f HeXDigit)
d9 = p () (f ()) -> p HeXDigit (f HeXDigit)
Prism' HeXDigit ()
_HeXDigit9
instance DA HeXDigit where; dA :: p () (f ()) -> p HeXDigit (f HeXDigit)
dA = p () (f ()) -> p HeXDigit (f HeXDigit)
Prism' HeXDigit ()
_HeXDigitA
instance Da HeXDigit where; da :: p () (f ()) -> p HeXDigit (f HeXDigit)
da = p () (f ()) -> p HeXDigit (f HeXDigit)
Prism' HeXDigit ()
_HeXDigita
instance DB HeXDigit where; dB :: p () (f ()) -> p HeXDigit (f HeXDigit)
dB = p () (f ()) -> p HeXDigit (f HeXDigit)
Prism' HeXDigit ()
_HeXDigitB
instance Db HeXDigit where; db :: p () (f ()) -> p HeXDigit (f HeXDigit)
db = p () (f ()) -> p HeXDigit (f HeXDigit)
Prism' HeXDigit ()
_HeXDigitb
instance DC HeXDigit where; dC :: p () (f ()) -> p HeXDigit (f HeXDigit)
dC = p () (f ()) -> p HeXDigit (f HeXDigit)
Prism' HeXDigit ()
_HeXDigitC
instance Dc HeXDigit where; dc :: p () (f ()) -> p HeXDigit (f HeXDigit)
dc = p () (f ()) -> p HeXDigit (f HeXDigit)
Prism' HeXDigit ()
_HeXDigitc
instance DD HeXDigit where; dD :: p () (f ()) -> p HeXDigit (f HeXDigit)
dD = p () (f ()) -> p HeXDigit (f HeXDigit)
Prism' HeXDigit ()
_HeXDigitD
instance Dd HeXDigit where; dd :: p () (f ()) -> p HeXDigit (f HeXDigit)
dd = p () (f ()) -> p HeXDigit (f HeXDigit)
Prism' HeXDigit ()
_HeXDigitd
instance DE HeXDigit where; dE :: p () (f ()) -> p HeXDigit (f HeXDigit)
dE = p () (f ()) -> p HeXDigit (f HeXDigit)
Prism' HeXDigit ()
_HeXDigitE
instance De HeXDigit where; de :: p () (f ()) -> p HeXDigit (f HeXDigit)
de = p () (f ()) -> p HeXDigit (f HeXDigit)
Prism' HeXDigit ()
_HeXDigite
instance DF HeXDigit where; dF :: p () (f ()) -> p HeXDigit (f HeXDigit)
dF = p () (f ()) -> p HeXDigit (f HeXDigit)
Prism' HeXDigit ()
_HeXDigitF
instance Df HeXDigit where; df :: p () (f ()) -> p HeXDigit (f HeXDigit)
df = p () (f ()) -> p HeXDigit (f HeXDigit)
Prism' HeXDigit ()
_HeXDigitf

type HeXaDeCiMaLNoZero d =
  (D1 d, D2 d, D3 d, D4 d, D5 d, D6 d, D7 d, D8 d, D9 d, DA d, DB d, DC d, DD d, DE d, DF d, Da d, Db d, Dc d, Dd d, De d, De d, Df d)

parseHeXaDeCiMaLNoZero ::
  (HeXaDeCiMaLNoZero d, CharParsing p) =>
  p d
parseHeXaDeCiMaLNoZero :: p d
parseHeXaDeCiMaLNoZero =
  [p d] -> p d
forall (m :: * -> *) a. Alternative m => [m a] -> m a
choice
    [
      p d
forall d (p :: * -> *). (DecimalNoZero d, CharParsing p) => p d
parseDecimalNoZero
    , p d
forall d (p :: * -> *). (DAa d, CharParsing p) => p d
parseAa
    , p d
forall d (p :: * -> *). (DBb d, CharParsing p) => p d
parseBb
    , p d
forall d (p :: * -> *). (DCc d, CharParsing p) => p d
parseCc
    , p d
forall d (p :: * -> *). (DDd d, CharParsing p) => p d
parseDd
    , p d
forall d (p :: * -> *). (DEe d, CharParsing p) => p d
parseEe
    , p d
forall d (p :: * -> *). (DFf d, CharParsing p) => p d
parseFf
    ] p d -> String -> p d
forall (m :: * -> *) a. Parsing m => m a -> String -> m a
<?> String
"HeXaDeCiMaLNoZero"

type HeXaDeCiMaL d =
  (D0 d, HeXaDeCiMaLNoZero d)

parseHeXaDeCiMaL ::
  (HeXaDeCiMaL d, CharParsing p) =>
  p d
parseHeXaDeCiMaL :: p d
parseHeXaDeCiMaL =
  [p d] -> p d
forall (m :: * -> *) a. Alternative m => [m a] -> m a
choice
    [
      p d
forall d (p :: * -> *). (D0 d, CharParsing p) => p d
parse0
    , p d
forall d (p :: * -> *). (HeXaDeCiMaLNoZero d, CharParsing p) => p d
parseHeXaDeCiMaLNoZero
    ] p d -> String -> p d
forall (m :: * -> *) a. Parsing m => m a -> String -> m a
<?> String
"HeXaDeCiMaL"