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