{-# 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
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
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
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
Ord)

makePrisms ''HEXDigit

instance D0 HEXDigit where; d0 :: Prism' HEXDigit ()
d0 = Prism' HEXDigit ()
_HEXDigit0
instance D1 HEXDigit where; d1 :: Prism' HEXDigit ()
d1 = Prism' HEXDigit ()
_HEXDigit1
instance D2 HEXDigit where; d2 :: Prism' HEXDigit ()
d2 = Prism' HEXDigit ()
_HEXDigit2
instance D3 HEXDigit where; d3 :: Prism' HEXDigit ()
d3 = Prism' HEXDigit ()
_HEXDigit3
instance D4 HEXDigit where; d4 :: Prism' HEXDigit ()
d4 = Prism' HEXDigit ()
_HEXDigit4
instance D5 HEXDigit where; d5 :: Prism' HEXDigit ()
d5 = Prism' HEXDigit ()
_HEXDigit5
instance D6 HEXDigit where; d6 :: Prism' HEXDigit ()
d6 = Prism' HEXDigit ()
_HEXDigit6
instance D7 HEXDigit where; d7 :: Prism' HEXDigit ()
d7 = Prism' HEXDigit ()
_HEXDigit7
instance D8 HEXDigit where; d8 :: Prism' HEXDigit ()
d8 = Prism' HEXDigit ()
_HEXDigit8
instance D9 HEXDigit where; d9 :: Prism' HEXDigit ()
d9 = Prism' HEXDigit ()
_HEXDigit9
instance DA HEXDigit where; dA :: Prism' HEXDigit ()
dA = Prism' HEXDigit ()
_HEXDigitA
instance DB HEXDigit where; dB :: Prism' HEXDigit ()
dB = Prism' HEXDigit ()
_HEXDigitB
instance DC HEXDigit where; dC :: Prism' HEXDigit ()
dC = Prism' HEXDigit ()
_HEXDigitC
instance DD HEXDigit where; dD :: Prism' HEXDigit ()
dD = Prism' HEXDigit ()
_HEXDigitD
instance DE HEXDigit where; dE :: Prism' HEXDigit ()
dE = Prism' HEXDigit ()
_HEXDigitE
instance DF HEXDigit where; dF :: Prism' HEXDigit ()
dF = 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 :: forall d (p :: * -> *). (HEXADECIMALNoZero d, CharParsing p) => p d
parseHEXADECIMALNoZero =
  forall (m :: * -> *) a. Alternative m => [m a] -> m a
choice
    [
      forall d (p :: * -> *). (DecimalNoZero d, CharParsing p) => p d
parseDecimalNoZero
    , forall d (p :: * -> *). (DA d, CharParsing p) => p d
parseA
    , forall d (p :: * -> *). (DB d, CharParsing p) => p d
parseB
    , forall d (p :: * -> *). (DC d, CharParsing p) => p d
parseC
    , forall d (p :: * -> *). (DD d, CharParsing p) => p d
parseD
    , forall d (p :: * -> *). (DE d, CharParsing p) => p d
parseE
    , forall d (p :: * -> *). (DF d, CharParsing p) => p d
parseF
    ] 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 :: forall d (p :: * -> *). (HEXADECIMAL d, CharParsing p) => p d
parseHEXADECIMAL =
  forall (m :: * -> *) a. Alternative m => [m a] -> m a
choice
    [
      forall d (p :: * -> *). (D0 d, CharParsing p) => p d
parse0
    , forall d (p :: * -> *). (HEXADECIMALNoZero d, CharParsing p) => p d
parseHEXADECIMALNoZero
    ] forall (m :: * -> *) a. Parsing m => m a -> String -> m a
<?> String
"HEXADECIMAL"