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

module Data.Digit.Decimal(
  DecDigit(..)
, DecDigitNoZero(..)
, DecimalNoZero
, Decimal
, parseDecimalNoZero
, parseDecimal
-- * Prisms
, _DecDigit0
, _DecDigit1
, _DecDigit2
, _DecDigit3
, _DecDigit4
, _DecDigit5
, _DecDigit6
, _DecDigit7
, _DecDigit8
, _DecDigit9
-- * 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
) where

import Prelude (Eq, Show, Ord, Enum, Bounded)
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

data DecDigit
  = DecDigit0
  | DecDigit1
  | DecDigit2
  | DecDigit3
  | DecDigit4
  | DecDigit5
  | DecDigit6
  | DecDigit7
  | DecDigit8
  | DecDigit9
  deriving (Int -> DecDigit -> ShowS
[DecDigit] -> ShowS
DecDigit -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DecDigit] -> ShowS
$cshowList :: [DecDigit] -> ShowS
show :: DecDigit -> String
$cshow :: DecDigit -> String
showsPrec :: Int -> DecDigit -> ShowS
$cshowsPrec :: Int -> DecDigit -> ShowS
Show, DecDigit -> DecDigit -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DecDigit -> DecDigit -> Bool
$c/= :: DecDigit -> DecDigit -> Bool
== :: DecDigit -> DecDigit -> Bool
$c== :: DecDigit -> DecDigit -> Bool
Eq, Eq DecDigit
DecDigit -> DecDigit -> Bool
DecDigit -> DecDigit -> Ordering
DecDigit -> DecDigit -> DecDigit
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 :: DecDigit -> DecDigit -> DecDigit
$cmin :: DecDigit -> DecDigit -> DecDigit
max :: DecDigit -> DecDigit -> DecDigit
$cmax :: DecDigit -> DecDigit -> DecDigit
>= :: DecDigit -> DecDigit -> Bool
$c>= :: DecDigit -> DecDigit -> Bool
> :: DecDigit -> DecDigit -> Bool
$c> :: DecDigit -> DecDigit -> Bool
<= :: DecDigit -> DecDigit -> Bool
$c<= :: DecDigit -> DecDigit -> Bool
< :: DecDigit -> DecDigit -> Bool
$c< :: DecDigit -> DecDigit -> Bool
compare :: DecDigit -> DecDigit -> Ordering
$ccompare :: DecDigit -> DecDigit -> Ordering
Ord, Int -> DecDigit
DecDigit -> Int
DecDigit -> [DecDigit]
DecDigit -> DecDigit
DecDigit -> DecDigit -> [DecDigit]
DecDigit -> DecDigit -> DecDigit -> [DecDigit]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: DecDigit -> DecDigit -> DecDigit -> [DecDigit]
$cenumFromThenTo :: DecDigit -> DecDigit -> DecDigit -> [DecDigit]
enumFromTo :: DecDigit -> DecDigit -> [DecDigit]
$cenumFromTo :: DecDigit -> DecDigit -> [DecDigit]
enumFromThen :: DecDigit -> DecDigit -> [DecDigit]
$cenumFromThen :: DecDigit -> DecDigit -> [DecDigit]
enumFrom :: DecDigit -> [DecDigit]
$cenumFrom :: DecDigit -> [DecDigit]
fromEnum :: DecDigit -> Int
$cfromEnum :: DecDigit -> Int
toEnum :: Int -> DecDigit
$ctoEnum :: Int -> DecDigit
pred :: DecDigit -> DecDigit
$cpred :: DecDigit -> DecDigit
succ :: DecDigit -> DecDigit
$csucc :: DecDigit -> DecDigit
Enum, DecDigit
forall a. a -> a -> Bounded a
maxBound :: DecDigit
$cmaxBound :: DecDigit
minBound :: DecDigit
$cminBound :: DecDigit
Bounded)

makePrisms ''DecDigit

instance D0 DecDigit where; d0 :: Prism' DecDigit ()
d0 = Prism' DecDigit ()
_DecDigit0
instance D1 DecDigit where; d1 :: Prism' DecDigit ()
d1 = Prism' DecDigit ()
_DecDigit1
instance D2 DecDigit where; d2 :: Prism' DecDigit ()
d2 = Prism' DecDigit ()
_DecDigit2
instance D3 DecDigit where; d3 :: Prism' DecDigit ()
d3 = Prism' DecDigit ()
_DecDigit3
instance D4 DecDigit where; d4 :: Prism' DecDigit ()
d4 = Prism' DecDigit ()
_DecDigit4
instance D5 DecDigit where; d5 :: Prism' DecDigit ()
d5 = Prism' DecDigit ()
_DecDigit5
instance D6 DecDigit where; d6 :: Prism' DecDigit ()
d6 = Prism' DecDigit ()
_DecDigit6
instance D7 DecDigit where; d7 :: Prism' DecDigit ()
d7 = Prism' DecDigit ()
_DecDigit7
instance D8 DecDigit where; d8 :: Prism' DecDigit ()
d8 = Prism' DecDigit ()
_DecDigit8
instance D9 DecDigit where; d9 :: Prism' DecDigit ()
d9 = Prism' DecDigit ()
_DecDigit9

data DecDigitNoZero =
  DecDigitNoZero1
  | DecDigitNoZero2
  | DecDigitNoZero3
  | DecDigitNoZero4
  | DecDigitNoZero5
  | DecDigitNoZero6
  | DecDigitNoZero7
  | DecDigitNoZero8
  | DecDigitNoZero9
  deriving (Int -> DecDigitNoZero -> ShowS
[DecDigitNoZero] -> ShowS
DecDigitNoZero -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DecDigitNoZero] -> ShowS
$cshowList :: [DecDigitNoZero] -> ShowS
show :: DecDigitNoZero -> String
$cshow :: DecDigitNoZero -> String
showsPrec :: Int -> DecDigitNoZero -> ShowS
$cshowsPrec :: Int -> DecDigitNoZero -> ShowS
Show, DecDigitNoZero -> DecDigitNoZero -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DecDigitNoZero -> DecDigitNoZero -> Bool
$c/= :: DecDigitNoZero -> DecDigitNoZero -> Bool
== :: DecDigitNoZero -> DecDigitNoZero -> Bool
$c== :: DecDigitNoZero -> DecDigitNoZero -> Bool
Eq, Eq DecDigitNoZero
DecDigitNoZero -> DecDigitNoZero -> Bool
DecDigitNoZero -> DecDigitNoZero -> Ordering
DecDigitNoZero -> DecDigitNoZero -> DecDigitNoZero
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 :: DecDigitNoZero -> DecDigitNoZero -> DecDigitNoZero
$cmin :: DecDigitNoZero -> DecDigitNoZero -> DecDigitNoZero
max :: DecDigitNoZero -> DecDigitNoZero -> DecDigitNoZero
$cmax :: DecDigitNoZero -> DecDigitNoZero -> DecDigitNoZero
>= :: DecDigitNoZero -> DecDigitNoZero -> Bool
$c>= :: DecDigitNoZero -> DecDigitNoZero -> Bool
> :: DecDigitNoZero -> DecDigitNoZero -> Bool
$c> :: DecDigitNoZero -> DecDigitNoZero -> Bool
<= :: DecDigitNoZero -> DecDigitNoZero -> Bool
$c<= :: DecDigitNoZero -> DecDigitNoZero -> Bool
< :: DecDigitNoZero -> DecDigitNoZero -> Bool
$c< :: DecDigitNoZero -> DecDigitNoZero -> Bool
compare :: DecDigitNoZero -> DecDigitNoZero -> Ordering
$ccompare :: DecDigitNoZero -> DecDigitNoZero -> Ordering
Ord, Int -> DecDigitNoZero
DecDigitNoZero -> Int
DecDigitNoZero -> [DecDigitNoZero]
DecDigitNoZero -> DecDigitNoZero
DecDigitNoZero -> DecDigitNoZero -> [DecDigitNoZero]
DecDigitNoZero
-> DecDigitNoZero -> DecDigitNoZero -> [DecDigitNoZero]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: DecDigitNoZero
-> DecDigitNoZero -> DecDigitNoZero -> [DecDigitNoZero]
$cenumFromThenTo :: DecDigitNoZero
-> DecDigitNoZero -> DecDigitNoZero -> [DecDigitNoZero]
enumFromTo :: DecDigitNoZero -> DecDigitNoZero -> [DecDigitNoZero]
$cenumFromTo :: DecDigitNoZero -> DecDigitNoZero -> [DecDigitNoZero]
enumFromThen :: DecDigitNoZero -> DecDigitNoZero -> [DecDigitNoZero]
$cenumFromThen :: DecDigitNoZero -> DecDigitNoZero -> [DecDigitNoZero]
enumFrom :: DecDigitNoZero -> [DecDigitNoZero]
$cenumFrom :: DecDigitNoZero -> [DecDigitNoZero]
fromEnum :: DecDigitNoZero -> Int
$cfromEnum :: DecDigitNoZero -> Int
toEnum :: Int -> DecDigitNoZero
$ctoEnum :: Int -> DecDigitNoZero
pred :: DecDigitNoZero -> DecDigitNoZero
$cpred :: DecDigitNoZero -> DecDigitNoZero
succ :: DecDigitNoZero -> DecDigitNoZero
$csucc :: DecDigitNoZero -> DecDigitNoZero
Enum, DecDigitNoZero
forall a. a -> a -> Bounded a
maxBound :: DecDigitNoZero
$cmaxBound :: DecDigitNoZero
minBound :: DecDigitNoZero
$cminBound :: DecDigitNoZero
Bounded)

makePrisms ''DecDigitNoZero

instance D1 DecDigitNoZero where; d1 :: Prism' DecDigitNoZero ()
d1 = Prism' DecDigitNoZero ()
_DecDigitNoZero1
instance D2 DecDigitNoZero where; d2 :: Prism' DecDigitNoZero ()
d2 = Prism' DecDigitNoZero ()
_DecDigitNoZero2
instance D3 DecDigitNoZero where; d3 :: Prism' DecDigitNoZero ()
d3 = Prism' DecDigitNoZero ()
_DecDigitNoZero3
instance D4 DecDigitNoZero where; d4 :: Prism' DecDigitNoZero ()
d4 = Prism' DecDigitNoZero ()
_DecDigitNoZero4
instance D5 DecDigitNoZero where; d5 :: Prism' DecDigitNoZero ()
d5 = Prism' DecDigitNoZero ()
_DecDigitNoZero5
instance D6 DecDigitNoZero where; d6 :: Prism' DecDigitNoZero ()
d6 = Prism' DecDigitNoZero ()
_DecDigitNoZero6
instance D7 DecDigitNoZero where; d7 :: Prism' DecDigitNoZero ()
d7 = Prism' DecDigitNoZero ()
_DecDigitNoZero7
instance D8 DecDigitNoZero where; d8 :: Prism' DecDigitNoZero ()
d8 = Prism' DecDigitNoZero ()
_DecDigitNoZero8
instance D9 DecDigitNoZero where; d9 :: Prism' DecDigitNoZero ()
d9 = Prism' DecDigitNoZero ()
_DecDigitNoZero9

type DecimalNoZero d =
  (D1 d, D2 d, D3 d, D4 d, D5 d, D6 d, D7 d, D8 d, D9 d)

parseDecimalNoZero ::
  (DecimalNoZero d, CharParsing p) =>
  p d
parseDecimalNoZero :: forall d (p :: * -> *). (DecimalNoZero d, CharParsing p) => p d
parseDecimalNoZero =
  forall (m :: * -> *) a. Alternative m => [m a] -> m a
choice
    [
      forall d (p :: * -> *). (D1 d, CharParsing p) => p d
parse1
    , forall d (p :: * -> *). (D2 d, CharParsing p) => p d
parse2
    , forall d (p :: * -> *). (D3 d, CharParsing p) => p d
parse3
    , forall d (p :: * -> *). (D4 d, CharParsing p) => p d
parse4
    , forall d (p :: * -> *). (D5 d, CharParsing p) => p d
parse5
    , forall d (p :: * -> *). (D6 d, CharParsing p) => p d
parse6
    , forall d (p :: * -> *). (D7 d, CharParsing p) => p d
parse7
    , forall d (p :: * -> *). (D8 d, CharParsing p) => p d
parse8
    , forall d (p :: * -> *). (D9 d, CharParsing p) => p d
parse9
    ] forall (m :: * -> *) a. Parsing m => m a -> String -> m a
<?> String
"DecimalNoZero"

type Decimal d =
  (D0 d, DecimalNoZero d)

parseDecimal ::
  (Decimal d, CharParsing p) =>
  p d
parseDecimal :: forall d (p :: * -> *). (Decimal d, CharParsing p) => p d
parseDecimal =
  forall (m :: * -> *) a. Alternative m => [m a] -> m a
choice
    [
      forall d (p :: * -> *). (D0 d, CharParsing p) => p d
parse0
    , forall d (p :: * -> *). (DecimalNoZero d, CharParsing p) => p d
parseDecimalNoZero
    ] forall (m :: * -> *) a. Parsing m => m a -> String -> m a
<?> String
"Decimal"