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

module Data.Digit.Hexadecimal.LowerCase(
  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.LowerCase
) 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.LowerCase

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, 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"