module Data.D10.Safe
(
D10 (..)
, d10list
, d10ListExp
, d10ListPat
, d10Char
, charD10Maybe
, charD10Either
, charD10Fail
, d10Str
, strD10Maybe
, strD10Either
, strD10Fail
, strD10ListMaybe
, strD10ListEither
, strD10ListFail
, d10Nat
, natD10Maybe
, natD10Either
, natD10Fail
, natMod10
, d10Integer
, integerD10Maybe
, integerD10Either
, integerD10Fail
, integerMod10
, d10Int
, intD10Maybe
, intD10Either
, intD10Fail
, intMod10
, d10Num
, integralD10Maybe
, integralD10Either
, integralD10Fail
, integralMod10
, (+), (-), (*)
) where
import Control.Monad ((>=>))
import Control.Monad.Fail (MonadFail (fail))
import Data.Data (Data)
import GHC.Generics (Generic)
import Numeric.Natural (Natural)
import Prelude hiding (fail, (+), (-), (*))
import qualified Prelude as P
import Language.Haskell.TH.Quote (QuasiQuoter (..))
import Language.Haskell.TH.Syntax (Exp (..), Lift, Pat (..), Q, dataToPatQ)
data D10
= D0
| D1
| D2
| D3
| D4
| D5
| D6
| D7
| D8
| D9
deriving (D10
D10 -> D10 -> Bounded D10
forall a. a -> a -> Bounded a
maxBound :: D10
$cmaxBound :: D10
minBound :: D10
$cminBound :: D10
Bounded, Int -> D10
D10 -> Int
D10 -> [D10]
D10 -> D10
D10 -> D10 -> [D10]
D10 -> D10 -> D10 -> [D10]
(D10 -> D10)
-> (D10 -> D10)
-> (Int -> D10)
-> (D10 -> Int)
-> (D10 -> [D10])
-> (D10 -> D10 -> [D10])
-> (D10 -> D10 -> [D10])
-> (D10 -> D10 -> D10 -> [D10])
-> Enum D10
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 :: D10 -> D10 -> D10 -> [D10]
$cenumFromThenTo :: D10 -> D10 -> D10 -> [D10]
enumFromTo :: D10 -> D10 -> [D10]
$cenumFromTo :: D10 -> D10 -> [D10]
enumFromThen :: D10 -> D10 -> [D10]
$cenumFromThen :: D10 -> D10 -> [D10]
enumFrom :: D10 -> [D10]
$cenumFrom :: D10 -> [D10]
fromEnum :: D10 -> Int
$cfromEnum :: D10 -> Int
toEnum :: Int -> D10
$ctoEnum :: Int -> D10
pred :: D10 -> D10
$cpred :: D10 -> D10
succ :: D10 -> D10
$csucc :: D10 -> D10
Enum, D10 -> D10 -> Bool
(D10 -> D10 -> Bool) -> (D10 -> D10 -> Bool) -> Eq D10
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: D10 -> D10 -> Bool
$c/= :: D10 -> D10 -> Bool
== :: D10 -> D10 -> Bool
$c== :: D10 -> D10 -> Bool
Eq, D10 -> Q Exp
D10 -> Q (TExp D10)
(D10 -> Q Exp) -> (D10 -> Q (TExp D10)) -> Lift D10
forall t. (t -> Q Exp) -> (t -> Q (TExp t)) -> Lift t
liftTyped :: D10 -> Q (TExp D10)
$cliftTyped :: D10 -> Q (TExp D10)
lift :: D10 -> Q Exp
$clift :: D10 -> Q Exp
Lift, Eq D10
Eq D10
-> (D10 -> D10 -> Ordering)
-> (D10 -> D10 -> Bool)
-> (D10 -> D10 -> Bool)
-> (D10 -> D10 -> Bool)
-> (D10 -> D10 -> Bool)
-> (D10 -> D10 -> D10)
-> (D10 -> D10 -> D10)
-> Ord D10
D10 -> D10 -> Bool
D10 -> D10 -> Ordering
D10 -> D10 -> D10
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 :: D10 -> D10 -> D10
$cmin :: D10 -> D10 -> D10
max :: D10 -> D10 -> D10
$cmax :: D10 -> D10 -> D10
>= :: D10 -> D10 -> Bool
$c>= :: D10 -> D10 -> Bool
> :: D10 -> D10 -> Bool
$c> :: D10 -> D10 -> Bool
<= :: D10 -> D10 -> Bool
$c<= :: D10 -> D10 -> Bool
< :: D10 -> D10 -> Bool
$c< :: D10 -> D10 -> Bool
compare :: D10 -> D10 -> Ordering
$ccompare :: D10 -> D10 -> Ordering
$cp1Ord :: Eq D10
Ord, Int -> D10 -> ShowS
[D10] -> ShowS
D10 -> String
(Int -> D10 -> ShowS)
-> (D10 -> String) -> ([D10] -> ShowS) -> Show D10
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [D10] -> ShowS
$cshowList :: [D10] -> ShowS
show :: D10 -> String
$cshow :: D10 -> String
showsPrec :: Int -> D10 -> ShowS
$cshowsPrec :: Int -> D10 -> ShowS
Show, Typeable D10
DataType
Constr
Typeable D10
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> D10 -> c D10)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c D10)
-> (D10 -> Constr)
-> (D10 -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c D10))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c D10))
-> ((forall b. Data b => b -> b) -> D10 -> D10)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> D10 -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> D10 -> r)
-> (forall u. (forall d. Data d => d -> u) -> D10 -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> D10 -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> D10 -> m D10)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> D10 -> m D10)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> D10 -> m D10)
-> Data D10
D10 -> DataType
D10 -> Constr
(forall b. Data b => b -> b) -> D10 -> D10
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> D10 -> c D10
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c D10
forall a.
Typeable a
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> D10 -> u
forall u. (forall d. Data d => d -> u) -> D10 -> [u]
forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> D10 -> r
forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> D10 -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> D10 -> m D10
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> D10 -> m D10
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c D10
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> D10 -> c D10
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c D10)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c D10)
$cD9 :: Constr
$cD8 :: Constr
$cD7 :: Constr
$cD6 :: Constr
$cD5 :: Constr
$cD4 :: Constr
$cD3 :: Constr
$cD2 :: Constr
$cD1 :: Constr
$cD0 :: Constr
$tD10 :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> D10 -> m D10
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> D10 -> m D10
gmapMp :: (forall d. Data d => d -> m d) -> D10 -> m D10
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> D10 -> m D10
gmapM :: (forall d. Data d => d -> m d) -> D10 -> m D10
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> D10 -> m D10
gmapQi :: Int -> (forall d. Data d => d -> u) -> D10 -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> D10 -> u
gmapQ :: (forall d. Data d => d -> u) -> D10 -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> D10 -> [u]
gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> D10 -> r
$cgmapQr :: forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> D10 -> r
gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> D10 -> r
$cgmapQl :: forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> D10 -> r
gmapT :: (forall b. Data b => b -> b) -> D10 -> D10
$cgmapT :: (forall b. Data b => b -> b) -> D10 -> D10
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c D10)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c D10)
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c D10)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c D10)
dataTypeOf :: D10 -> DataType
$cdataTypeOf :: D10 -> DataType
toConstr :: D10 -> Constr
$ctoConstr :: D10 -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c D10
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c D10
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> D10 -> c D10
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> D10 -> c D10
$cp1Data :: Typeable D10
Data, (forall x. D10 -> Rep D10 x)
-> (forall x. Rep D10 x -> D10) -> Generic D10
forall x. Rep D10 x -> D10
forall x. D10 -> Rep D10 x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep D10 x -> D10
$cfrom :: forall x. D10 -> Rep D10 x
Generic)
d10Char :: D10 -> Char
d10Char :: D10 -> Char
d10Char D10
x =
case D10
x of
D10
D0 -> Char
'0'
D10
D1 -> Char
'1'
D10
D2 -> Char
'2'
D10
D3 -> Char
'3'
D10
D4 -> Char
'4'
D10
D5 -> Char
'5'
D10
D6 -> Char
'6'
D10
D7 -> Char
'7'
D10
D8 -> Char
'8'
D10
D9 -> Char
'9'
d10Str :: D10 -> String
d10Str :: D10 -> String
d10Str D10
x = [D10 -> Char
d10Char D10
x]
d10Nat :: D10 -> Natural
d10Nat :: D10 -> Natural
d10Nat = D10 -> Natural
forall a. Num a => D10 -> a
d10Num
d10Integer :: D10 -> Integer
d10Integer :: D10 -> Integer
d10Integer = D10 -> Integer
forall a. Num a => D10 -> a
d10Num
d10Int :: D10 -> Int
d10Int :: D10 -> Int
d10Int = D10 -> Int
forall a. Num a => D10 -> a
d10Num
d10Num :: Num a => D10 -> a
d10Num :: D10 -> a
d10Num D10
x =
case D10
x of
D10
D0 -> a
0
D10
D1 -> a
1
D10
D2 -> a
2
D10
D3 -> a
3
D10
D4 -> a
4
D10
D5 -> a
5
D10
D6 -> a
6
D10
D7 -> a
7
D10
D8 -> a
8
D10
D9 -> a
9
natMod10 :: Natural -> D10
natMod10 :: Natural -> D10
natMod10 = Natural -> D10
forall a. Integral a => a -> D10
integralMod10
integerMod10 :: Integer -> D10
integerMod10 :: Integer -> D10
integerMod10 = Integer -> D10
forall a. Integral a => a -> D10
integralMod10
intMod10 :: Int -> D10
intMod10 :: Int -> D10
intMod10 = Int -> D10
forall a. Integral a => a -> D10
integralMod10
integralMod10 :: Integral a => a -> D10
integralMod10 :: a -> D10
integralMod10 a
x =
case (a
x a -> a -> a
forall a. Integral a => a -> a -> a
`mod` a
10) of
a
0 -> D10
D0
a
1 -> D10
D1
a
2 -> D10
D2
a
3 -> D10
D3
a
4 -> D10
D4
a
5 -> D10
D5
a
6 -> D10
D6
a
7 -> D10
D7
a
8 -> D10
D8
a
9 -> D10
D9
a
_ -> String -> D10
forall a. HasCallStack => String -> a
error String
"x `mod` 10 is not between 0 and 9"
charD10Maybe :: Char -> Maybe D10
charD10Maybe :: Char -> Maybe D10
charD10Maybe Char
x =
case Char
x of
Char
'0' -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D0
Char
'1' -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D1
Char
'2' -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D2
Char
'3' -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D3
Char
'4' -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D4
Char
'5' -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D5
Char
'6' -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D6
Char
'7' -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D7
Char
'8' -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D8
Char
'9' -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D9
Char
_ -> Maybe D10
forall a. Maybe a
Nothing
strD10Maybe :: String -> Maybe D10
strD10Maybe :: String -> Maybe D10
strD10Maybe [Char
x] = Char -> Maybe D10
charD10Maybe Char
x
strD10Maybe String
_ = Maybe D10
forall a. Maybe a
Nothing
strD10ListMaybe :: String -> Maybe [D10]
strD10ListMaybe :: String -> Maybe [D10]
strD10ListMaybe = (Char -> Maybe D10) -> String -> Maybe [D10]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse Char -> Maybe D10
charD10Maybe
natD10Maybe :: Natural -> Maybe D10
natD10Maybe :: Natural -> Maybe D10
natD10Maybe = Natural -> Maybe D10
forall a. Integral a => a -> Maybe D10
integralD10Maybe
integerD10Maybe :: Integer -> Maybe D10
integerD10Maybe :: Integer -> Maybe D10
integerD10Maybe = Integer -> Maybe D10
forall a. Integral a => a -> Maybe D10
integralD10Maybe
intD10Maybe :: Int -> Maybe D10
intD10Maybe :: Int -> Maybe D10
intD10Maybe = Int -> Maybe D10
forall a. Integral a => a -> Maybe D10
integralD10Maybe
integralD10Maybe :: Integral a => a -> Maybe D10
integralD10Maybe :: a -> Maybe D10
integralD10Maybe a
x =
case a
x of
a
0 -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D0
a
1 -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D1
a
2 -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D2
a
3 -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D3
a
4 -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D4
a
5 -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D5
a
6 -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D6
a
7 -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D7
a
8 -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D8
a
9 -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D9
a
_ -> Maybe D10
forall a. Maybe a
Nothing
charD10Either :: Char -> Either String D10
charD10Either :: Char -> Either String D10
charD10Either Char
x =
case Char
x of
Char
'0' -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D0
Char
'1' -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D1
Char
'2' -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D2
Char
'3' -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D3
Char
'4' -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D4
Char
'5' -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D5
Char
'6' -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D6
Char
'7' -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D7
Char
'8' -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D8
Char
'9' -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D9
Char
_ -> String -> Either String D10
forall a b. a -> Either a b
Left String
"d10 must be between 0 and 9"
strD10Either :: String -> Either String D10
strD10Either :: String -> Either String D10
strD10Either [Char
x] = Char -> Either String D10
charD10Either Char
x
strD10Either String
_ = String -> Either String D10
forall a b. a -> Either a b
Left String
"d10 must be a single character"
strD10ListEither :: String -> Either String [D10]
strD10ListEither :: String -> Either String [D10]
strD10ListEither = (Char -> Either String D10) -> String -> Either String [D10]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse Char -> Either String D10
charD10Either
natD10Either :: Natural -> Either String D10
natD10Either :: Natural -> Either String D10
natD10Either Natural
x =
case Natural
x of
Natural
0 -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D0
Natural
1 -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D1
Natural
2 -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D2
Natural
3 -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D3
Natural
4 -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D4
Natural
5 -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D5
Natural
6 -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D6
Natural
7 -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D7
Natural
8 -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D8
Natural
9 -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D9
Natural
_ -> String -> Either String D10
forall a b. a -> Either a b
Left String
"d10 must be less than 10"
integerD10Either :: Integer -> Either String D10
integerD10Either :: Integer -> Either String D10
integerD10Either = Integer -> Either String D10
forall a. Integral a => a -> Either String D10
integralD10Either
intD10Either :: Int -> Either String D10
intD10Either :: Int -> Either String D10
intD10Either = Int -> Either String D10
forall a. Integral a => a -> Either String D10
integralD10Either
integralD10Either :: Integral a => a -> Either String D10
integralD10Either :: a -> Either String D10
integralD10Either a
x =
case (a -> Maybe D10
forall a. Integral a => a -> Maybe D10
integralD10Maybe a
x) of
Just D10
y -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
y
Maybe D10
Nothing -> String -> Either String D10
forall a b. a -> Either a b
Left String
"d10 must be between 0 and 9"
charD10Fail :: MonadFail m => Char -> m D10
charD10Fail :: Char -> m D10
charD10Fail Char
x =
case Char
x of
Char
'0' -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D0
Char
'1' -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D1
Char
'2' -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D2
Char
'3' -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D3
Char
'4' -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D4
Char
'5' -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D5
Char
'6' -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D6
Char
'7' -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D7
Char
'8' -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D8
Char
'9' -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D9
Char
_ -> String -> m D10
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"d10 must be between 0 and 9"
strD10Fail :: MonadFail m => String -> m D10
strD10Fail :: String -> m D10
strD10Fail [Char
x] = Char -> m D10
forall (m :: * -> *). MonadFail m => Char -> m D10
charD10Fail Char
x
strD10Fail String
_ = String -> m D10
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"d10 must be a single character"
strD10ListFail :: MonadFail m => String -> m [D10]
strD10ListFail :: String -> m [D10]
strD10ListFail = (Char -> m D10) -> String -> m [D10]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse Char -> m D10
forall (m :: * -> *). MonadFail m => Char -> m D10
charD10Fail
natD10Fail :: MonadFail m => Natural -> m D10
natD10Fail :: Natural -> m D10
natD10Fail Natural
x =
case Natural
x of
Natural
0 -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D0
Natural
1 -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D1
Natural
2 -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D2
Natural
3 -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D3
Natural
4 -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D4
Natural
5 -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D5
Natural
6 -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D6
Natural
7 -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D7
Natural
8 -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D8
Natural
9 -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D9
Natural
_ -> String -> m D10
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"d10 must be less than 10"
integerD10Fail :: MonadFail m => Integer -> m D10
integerD10Fail :: Integer -> m D10
integerD10Fail = Integer -> m D10
forall a (m :: * -> *). (Integral a, MonadFail m) => a -> m D10
integralD10Fail
intD10Fail :: MonadFail m => Int -> m D10
intD10Fail :: Int -> m D10
intD10Fail = Int -> m D10
forall a (m :: * -> *). (Integral a, MonadFail m) => a -> m D10
integralD10Fail
integralD10Fail :: (Integral a, MonadFail m) => a -> m D10
integralD10Fail :: a -> m D10
integralD10Fail a
x =
case (a -> Maybe D10
forall a. Integral a => a -> Maybe D10
integralD10Maybe a
x) of
Just D10
y -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
y
Maybe D10
Nothing -> String -> m D10
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"d10 must be between 0 and 9"
d10ListExp :: String -> Q Exp
d10ListExp :: String -> Q Exp
d10ListExp = String -> Q [D10]
forall (m :: * -> *). MonadFail m => String -> m [D10]
strD10ListFail (String -> Q [D10]) -> ([D10] -> Q Exp) -> String -> Q Exp
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> [D10] -> Q Exp
d10ListExp'
d10ListExp' :: [D10] -> Q Exp
d10ListExp' :: [D10] -> Q Exp
d10ListExp' [D10]
x = [| x |]
d10Pat :: D10 -> Q Pat
d10Pat :: D10 -> Q Pat
d10Pat = (forall b. Data b => b -> Maybe (Q Pat)) -> D10 -> Q Pat
forall a.
Data a =>
(forall b. Data b => b -> Maybe (Q Pat)) -> a -> Q Pat
dataToPatQ (Maybe (Q Pat) -> b -> Maybe (Q Pat)
forall a b. a -> b -> a
const Maybe (Q Pat)
forall a. Maybe a
Nothing)
d10ListPat :: String -> Q Pat
d10ListPat :: String -> Q Pat
d10ListPat = String -> Q [D10]
forall (m :: * -> *). MonadFail m => String -> m [D10]
strD10ListFail (String -> Q [D10]) -> ([D10] -> Q Pat) -> String -> Q Pat
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> \[D10]
xs ->
do
[Pat]
pats <- (D10 -> Q Pat) -> [D10] -> Q [Pat]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse D10 -> Q Pat
d10Pat [D10]
xs
Pat -> Q Pat
forall (m :: * -> *) a. Monad m => a -> m a
return ([Pat] -> Pat
ListP [Pat]
pats)
d10ListPat' :: [D10] -> Q Pat
d10ListPat' :: [D10] -> Q Pat
d10ListPat' [D10]
xs =
do
[Pat]
pats <- (D10 -> Q Pat) -> [D10] -> Q [Pat]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse D10 -> Q Pat
d10Pat [D10]
xs
Pat -> Q Pat
forall (m :: * -> *) a. Monad m => a -> m a
return ([Pat] -> Pat
ListP [Pat]
pats)
d10list :: QuasiQuoter
d10list :: QuasiQuoter
d10list = QuasiQuoter :: (String -> Q Exp)
-> (String -> Q Pat)
-> (String -> Q Type)
-> (String -> Q [Dec])
-> QuasiQuoter
QuasiQuoter
{ quoteExp :: String -> Q Exp
quoteExp = String -> Q [D10]
forall (m :: * -> *). MonadFail m => String -> m [D10]
strD10ListFail (String -> Q [D10]) -> ([D10] -> Q Exp) -> String -> Q Exp
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> [D10] -> Q Exp
d10ListExp'
, quotePat :: String -> Q Pat
quotePat = String -> Q [D10]
forall (m :: * -> *). MonadFail m => String -> m [D10]
strD10ListFail (String -> Q [D10]) -> ([D10] -> Q Pat) -> String -> Q Pat
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> [D10] -> Q Pat
d10ListPat'
, quoteType :: String -> Q Type
quoteType = \String
_ -> String -> Q Type
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"d10list cannot be used in a type context"
, quoteDec :: String -> Q [Dec]
quoteDec = \String
_ -> String -> Q [Dec]
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"d10list cannot be used in a declaration context"
}
(+) :: D10 -> D10 -> D10
D10
x + :: D10 -> D10 -> D10
+ D10
y = Int -> D10
intMod10 (D10 -> Int
d10Int D10
x Int -> Int -> Int
forall a. Num a => a -> a -> a
P.+ D10 -> Int
d10Int D10
y)
(-) :: D10 -> D10 -> D10
D10
x - :: D10 -> D10 -> D10
- D10
y = Int -> D10
intMod10 (D10 -> Int
d10Int D10
x Int -> Int -> Int
forall a. Num a => a -> a -> a
P.- D10 -> Int
d10Int D10
y)
(*) :: D10 -> D10 -> D10
D10
x * :: D10 -> D10 -> D10
* D10
y = Int -> D10
intMod10 (D10 -> Int
d10Int D10
x Int -> Int -> Int
forall a. Num a => a -> a -> a
P.* D10 -> Int
d10Int D10
y)