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

module Data.Digit.Hexadecimal.UpperCase(
  HEXDigit(..)
, HEXADECIMALNoZero
, HEXADECIMAL
, parseHEXADECIMALNoZero
, parseHEXADECIMAL
-- * Prisms
, _HEXDigit0
, _HEXDigit1
, _HEXDigit2
, _HEXDigit3
, _HEXDigit4
, _HEXDigit5
, _HEXDigit6
, _HEXDigit7
, _HEXDigit8
, _HEXDigit9
, _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.UpperCase
) 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.UpperCase
import Data.Digit.Decimal(parseDecimalNoZero)

data HEXDigit
  = HEXDigit0
  | HEXDigit1
  | HEXDigit2
  | HEXDigit3
  | HEXDigit4
  | HEXDigit5
  | HEXDigit6
  | HEXDigit7
  | HEXDigit8
  | HEXDigit9
  | 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 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 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 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)

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 :: * -> *). (DA d, CharParsing p) => p d
parseA
    , p d
forall d (p :: * -> *). (DB d, CharParsing p) => p d
parseB
    , p d
forall d (p :: * -> *). (DC d, CharParsing p) => p d
parseC
    , p d
forall d (p :: * -> *). (DD d, CharParsing p) => p d
parseD
    , p d
forall d (p :: * -> *). (DE d, CharParsing p) => p d
parseE
    , p d
forall d (p :: * -> *). (DF d, CharParsing p) => p d
parseF
    ] 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"