module Data.D10.Num
(
D10 (..)
, d10
, d10list
, d10Exp
, d10ListExp
, d10Pat
, 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 Data.D10.Predicate
import Control.Monad ((>=>))
import Control.Monad.Fail (MonadFail (fail))
import Data.Char (chr, ord)
import Data.Monoid (Endo (..))
import Numeric.Natural (Natural)
import Prelude hiding (fail, (+), (-), (*))
import qualified Prelude as P
import Language.Haskell.TH.Lib (litP, integerL)
import Language.Haskell.TH.Quote (QuasiQuoter (..))
import Language.Haskell.TH.Syntax (Exp (..), Lift, Pat (..), Q)
newtype D10 a =
D10_Unsafe a
deriving (D10 a -> D10 a -> Bool
(D10 a -> D10 a -> Bool) -> (D10 a -> D10 a -> Bool) -> Eq (D10 a)
forall a. Eq a => D10 a -> D10 a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: D10 a -> D10 a -> Bool
$c/= :: forall a. Eq a => D10 a -> D10 a -> Bool
== :: D10 a -> D10 a -> Bool
$c== :: forall a. Eq a => D10 a -> D10 a -> Bool
Eq, Eq (D10 a)
Eq (D10 a)
-> (D10 a -> D10 a -> Ordering)
-> (D10 a -> D10 a -> Bool)
-> (D10 a -> D10 a -> Bool)
-> (D10 a -> D10 a -> Bool)
-> (D10 a -> D10 a -> Bool)
-> (D10 a -> D10 a -> D10 a)
-> (D10 a -> D10 a -> D10 a)
-> Ord (D10 a)
D10 a -> D10 a -> Bool
D10 a -> D10 a -> Ordering
D10 a -> D10 a -> D10 a
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
forall a. Ord a => Eq (D10 a)
forall a. Ord a => D10 a -> D10 a -> Bool
forall a. Ord a => D10 a -> D10 a -> Ordering
forall a. Ord a => D10 a -> D10 a -> D10 a
min :: D10 a -> D10 a -> D10 a
$cmin :: forall a. Ord a => D10 a -> D10 a -> D10 a
max :: D10 a -> D10 a -> D10 a
$cmax :: forall a. Ord a => D10 a -> D10 a -> D10 a
>= :: D10 a -> D10 a -> Bool
$c>= :: forall a. Ord a => D10 a -> D10 a -> Bool
> :: D10 a -> D10 a -> Bool
$c> :: forall a. Ord a => D10 a -> D10 a -> Bool
<= :: D10 a -> D10 a -> Bool
$c<= :: forall a. Ord a => D10 a -> D10 a -> Bool
< :: D10 a -> D10 a -> Bool
$c< :: forall a. Ord a => D10 a -> D10 a -> Bool
compare :: D10 a -> D10 a -> Ordering
$ccompare :: forall a. Ord a => D10 a -> D10 a -> Ordering
$cp1Ord :: forall a. Ord a => Eq (D10 a)
Ord, D10 a -> Q Exp
D10 a -> Q (TExp (D10 a))
(D10 a -> Q Exp) -> (D10 a -> Q (TExp (D10 a))) -> Lift (D10 a)
forall a. Lift a => D10 a -> Q Exp
forall a. Lift a => D10 a -> Q (TExp (D10 a))
forall t. (t -> Q Exp) -> (t -> Q (TExp t)) -> Lift t
liftTyped :: D10 a -> Q (TExp (D10 a))
$cliftTyped :: forall a. Lift a => D10 a -> Q (TExp (D10 a))
lift :: D10 a -> Q Exp
$clift :: forall a. Lift a => D10 a -> Q Exp
Lift)
instance Num a => Bounded (D10 a)
where
minBound :: D10 a
minBound = a -> D10 a
forall a. a -> D10 a
D10_Unsafe a
0
maxBound :: D10 a
maxBound = a -> D10 a
forall a. a -> D10 a
D10_Unsafe a
9
instance Integral a => Enum (D10 a)
where
fromEnum :: D10 a -> Int
fromEnum :: D10 a -> Int
fromEnum = D10 a -> Int
forall a. Integral a => D10 a -> Int
d10Int
toEnum :: Int -> D10 a
toEnum :: Int -> D10 a
toEnum = ([Char] -> D10 a)
-> (D10 a -> D10 a) -> Either [Char] (D10 a) -> D10 a
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either [Char] -> D10 a
forall a. HasCallStack => [Char] -> a
error D10 a -> D10 a
forall a. a -> a
id (Either [Char] (D10 a) -> D10 a)
-> (Int -> Either [Char] (D10 a)) -> Int -> D10 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Either [Char] (D10 a)
forall a. Num a => Int -> Either [Char] (D10 a)
intD10Either
enumFrom :: D10 a -> [D10 a]
enumFrom :: D10 a -> [D10 a]
enumFrom D10 a
x = D10 a -> D10 a -> [D10 a]
forall a. Enum a => a -> a -> [a]
enumFromTo D10 a
x D10 a
forall a. Bounded a => a
maxBound
enumFromThen :: D10 a -> D10 a -> [D10 a]
enumFromThen :: D10 a -> D10 a -> [D10 a]
enumFromThen D10 a
x D10 a
y = D10 a -> D10 a -> D10 a -> [D10 a]
forall a. Enum a => a -> a -> a -> [a]
enumFromThenTo D10 a
x D10 a
y D10 a
bound
where
bound :: D10 a
bound | D10 a -> Int
forall a. Enum a => a -> Int
fromEnum D10 a
y Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= D10 a -> Int
forall a. Enum a => a -> Int
fromEnum D10 a
x = D10 a
forall a. Bounded a => a
maxBound
| Bool
otherwise = D10 a
forall a. Bounded a => a
minBound
succ :: D10 a -> D10 a
succ (D10_Unsafe a
9) = [Char] -> D10 a
forall a. HasCallStack => [Char] -> a
error [Char]
"D10 overflow"
succ (D10_Unsafe a
x) = a -> D10 a
forall a. a -> D10 a
D10_Unsafe (a -> a
forall a. Enum a => a -> a
succ a
x)
pred :: D10 a -> D10 a
pred (D10_Unsafe a
0) = [Char] -> D10 a
forall a. HasCallStack => [Char] -> a
error [Char]
"D10 underflow"
pred (D10_Unsafe a
x) = a -> D10 a
forall a. a -> D10 a
D10_Unsafe (a -> a
forall a. Enum a => a -> a
pred a
x)
instance Integral a => Show (D10 a) where
showsPrec :: Int -> D10 a -> ShowS
showsPrec Int
_ D10 a
x = [Char] -> ShowS
showString [Char]
"[d10|" ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. D10 a -> ShowS
forall a. Integral a => D10 a -> ShowS
showsChar D10 a
x ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> ShowS
showString [Char]
"|]"
showList :: [D10 a] -> ShowS
showList [D10 a]
xs = [Char] -> ShowS
showString [Char]
"[d10list|" ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [D10 a] -> ShowS
forall a. Integral a => [D10 a] -> ShowS
showsStr [D10 a]
xs ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> ShowS
showString [Char]
"|]"
showsChar :: Integral a => D10 a -> ShowS
showsChar :: D10 a -> ShowS
showsChar = Char -> ShowS
showChar (Char -> ShowS) -> (D10 a -> Char) -> D10 a -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. D10 a -> Char
forall a. Integral a => D10 a -> Char
d10Char
showsStr :: Integral a => [D10 a] -> ShowS
showsStr :: [D10 a] -> ShowS
showsStr = Endo [Char] -> ShowS
forall a. Endo a -> a -> a
appEndo (Endo [Char] -> ShowS)
-> ([D10 a] -> Endo [Char]) -> [D10 a] -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (D10 a -> Endo [Char]) -> [D10 a] -> Endo [Char]
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (ShowS -> Endo [Char]
forall a. (a -> a) -> Endo a
Endo (ShowS -> Endo [Char]) -> (D10 a -> ShowS) -> D10 a -> Endo [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. D10 a -> ShowS
forall a. Integral a => D10 a -> ShowS
showsChar)
d10Char :: Integral a => D10 a -> Char
d10Char :: D10 a -> Char
d10Char (D10_Unsafe a
x) = Int -> Char
chr (Char -> Int
ord Char
'0' Int -> Int -> Int
forall a. Num a => a -> a -> a
P.+ a -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral a
x)
d10Str :: Integral a => D10 a -> String
d10Str :: D10 a -> [Char]
d10Str D10 a
x = [D10 a -> Char
forall a. Integral a => D10 a -> Char
d10Char D10 a
x]
d10Nat :: Integral a => D10 a -> Natural
d10Nat :: D10 a -> Natural
d10Nat = D10 a -> Natural
forall b a. (Integral b, Num a) => D10 b -> a
d10Num
d10Integer :: Integral a => D10 a -> Integer
d10Integer :: D10 a -> Integer
d10Integer = D10 a -> Integer
forall b a. (Integral b, Num a) => D10 b -> a
d10Num
d10Int :: Integral a => D10 a -> Int
d10Int :: D10 a -> Int
d10Int = D10 a -> Int
forall b a. (Integral b, Num a) => D10 b -> a
d10Num
d10Num :: (Integral b, Num a) => D10 b -> a
d10Num :: D10 b -> a
d10Num (D10_Unsafe b
x) = b -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral b
x
natMod10 :: Num a => Natural -> D10 a
natMod10 :: Natural -> D10 a
natMod10 = Natural -> D10 a
forall b a. (Num b, Integral a) => a -> D10 b
integralMod10
integerMod10 :: Num a => Integer -> D10 a
integerMod10 :: Integer -> D10 a
integerMod10 = Integer -> D10 a
forall b a. (Num b, Integral a) => a -> D10 b
integralMod10
intMod10 :: Num a => Int -> D10 a
intMod10 :: Int -> D10 a
intMod10 = Int -> D10 a
forall b a. (Num b, Integral a) => a -> D10 b
integralMod10
integralMod10 :: (Num b, Integral a) => a -> D10 b
integralMod10 :: a -> D10 b
integralMod10 a
x = b -> D10 b
forall a. a -> D10 a
D10_Unsafe (a -> b
forall a b. (Integral a, Num b) => a -> b
fromIntegral (a
x a -> a -> a
forall a. Integral a => a -> a -> a
`mod` a
10))
charD10Maybe :: Num a => Char -> Maybe (D10 a)
charD10Maybe :: Char -> Maybe (D10 a)
charD10Maybe Char
x
| Char -> Bool
isD10Char Char
x = D10 a -> Maybe (D10 a)
forall a. a -> Maybe a
Just (a -> D10 a
forall a. a -> D10 a
D10_Unsafe (Int -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Char -> Int
ord Char
x Int -> Int -> Int
forall a. Num a => a -> a -> a
P.- Char -> Int
ord Char
'0')))
| Bool
otherwise = Maybe (D10 a)
forall a. Maybe a
Nothing
strD10Maybe :: Num a => String -> Maybe (D10 a)
strD10Maybe :: [Char] -> Maybe (D10 a)
strD10Maybe [Char
x] = Char -> Maybe (D10 a)
forall a. Num a => Char -> Maybe (D10 a)
charD10Maybe Char
x
strD10Maybe [Char]
_ = Maybe (D10 a)
forall a. Maybe a
Nothing
strD10ListMaybe :: Num a => String -> Maybe [D10 a]
strD10ListMaybe :: [Char] -> Maybe [D10 a]
strD10ListMaybe = (Char -> Maybe (D10 a)) -> [Char] -> Maybe [D10 a]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse Char -> Maybe (D10 a)
forall a. Num a => Char -> Maybe (D10 a)
charD10Maybe
natD10Maybe :: Num a => Natural -> Maybe (D10 a)
natD10Maybe :: Natural -> Maybe (D10 a)
natD10Maybe Natural
x
| Natural -> Bool
isD10Nat Natural
x = D10 a -> Maybe (D10 a)
forall a. a -> Maybe a
Just (a -> D10 a
forall a. a -> D10 a
D10_Unsafe (Natural -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral Natural
x))
| Bool
otherwise = Maybe (D10 a)
forall a. Maybe a
Nothing
integerD10Maybe :: Num a => Integer -> Maybe (D10 a)
integerD10Maybe :: Integer -> Maybe (D10 a)
integerD10Maybe Integer
x
| Integer -> Bool
isD10Integer Integer
x = D10 a -> Maybe (D10 a)
forall a. a -> Maybe a
Just (a -> D10 a
forall a. a -> D10 a
D10_Unsafe (Integer -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
x))
| Bool
otherwise = Maybe (D10 a)
forall a. Maybe a
Nothing
intD10Maybe :: Num a => Int -> Maybe (D10 a)
intD10Maybe :: Int -> Maybe (D10 a)
intD10Maybe Int
x
| Int -> Bool
isD10Int Int
x = D10 a -> Maybe (D10 a)
forall a. a -> Maybe a
Just (a -> D10 a
forall a. a -> D10 a
D10_Unsafe (Int -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
x))
| Bool
otherwise = Maybe (D10 a)
forall a. Maybe a
Nothing
integralD10Maybe :: (Num b, Integral a) => a -> Maybe (D10 b)
integralD10Maybe :: a -> Maybe (D10 b)
integralD10Maybe a
x = Integer -> Maybe (D10 b)
forall a. Num a => Integer -> Maybe (D10 a)
integerD10Maybe (a -> Integer
forall a. Integral a => a -> Integer
toInteger a
x)
charD10Either :: Num a => Char -> Either String (D10 a)
charD10Either :: Char -> Either [Char] (D10 a)
charD10Either Char
x
| Char -> Bool
isD10Char Char
x = D10 a -> Either [Char] (D10 a)
forall a b. b -> Either a b
Right (a -> D10 a
forall a. a -> D10 a
D10_Unsafe (Int -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Char -> Int
ord Char
x Int -> Int -> Int
forall a. Num a => a -> a -> a
P.- Char -> Int
ord Char
'0')))
| Bool
otherwise = [Char] -> Either [Char] (D10 a)
forall a b. a -> Either a b
Left [Char]
"d10 must be between 0 and 9"
strD10Either :: Num a => String -> Either String (D10 a)
strD10Either :: [Char] -> Either [Char] (D10 a)
strD10Either [Char
x] = Char -> Either [Char] (D10 a)
forall a. Num a => Char -> Either [Char] (D10 a)
charD10Either Char
x
strD10Either [Char]
_ = [Char] -> Either [Char] (D10 a)
forall a b. a -> Either a b
Left [Char]
"d10 must be a single character"
strD10ListEither :: Num a => String -> Either String [D10 a]
strD10ListEither :: [Char] -> Either [Char] [D10 a]
strD10ListEither = (Char -> Either [Char] (D10 a)) -> [Char] -> Either [Char] [D10 a]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse Char -> Either [Char] (D10 a)
forall a. Num a => Char -> Either [Char] (D10 a)
charD10Either
natD10Either :: Num a => Natural -> Either String (D10 a)
natD10Either :: Natural -> Either [Char] (D10 a)
natD10Either Natural
x =
case (Natural -> Maybe (D10 a)
forall a. Num a => Natural -> Maybe (D10 a)
natD10Maybe Natural
x) of
Just D10 a
y -> D10 a -> Either [Char] (D10 a)
forall a b. b -> Either a b
Right D10 a
y
Maybe (D10 a)
Nothing -> [Char] -> Either [Char] (D10 a)
forall a b. a -> Either a b
Left [Char]
"d10 must be less than 10"
integerD10Either :: Num a => Integer -> Either String (D10 a)
integerD10Either :: Integer -> Either [Char] (D10 a)
integerD10Either Integer
x =
case (Integer -> Maybe (D10 a)
forall a. Num a => Integer -> Maybe (D10 a)
integerD10Maybe Integer
x) of
Just D10 a
y -> D10 a -> Either [Char] (D10 a)
forall a b. b -> Either a b
Right D10 a
y
Maybe (D10 a)
Nothing -> [Char] -> Either [Char] (D10 a)
forall a b. a -> Either a b
Left [Char]
"d10 must be between 0 and 9"
intD10Either :: Num a => Int -> Either String (D10 a)
intD10Either :: Int -> Either [Char] (D10 a)
intD10Either Int
x =
case (Int -> Maybe (D10 a)
forall a. Num a => Int -> Maybe (D10 a)
intD10Maybe Int
x) of
Just D10 a
y -> D10 a -> Either [Char] (D10 a)
forall a b. b -> Either a b
Right D10 a
y
Maybe (D10 a)
Nothing -> [Char] -> Either [Char] (D10 a)
forall a b. a -> Either a b
Left [Char]
"d10 must be between 0 and 9"
integralD10Either :: (Num b, Integral a) => a -> Either String (D10 b)
integralD10Either :: a -> Either [Char] (D10 b)
integralD10Either a
x = Integer -> Either [Char] (D10 b)
forall a. Num a => Integer -> Either [Char] (D10 a)
integerD10Either (a -> Integer
forall a. Integral a => a -> Integer
toInteger a
x)
charD10Fail :: (Num a, MonadFail m) => Char -> m (D10 a)
charD10Fail :: Char -> m (D10 a)
charD10Fail Char
x
| Char -> Bool
isD10Char Char
x = D10 a -> m (D10 a)
forall (m :: * -> *) a. Monad m => a -> m a
return (a -> D10 a
forall a. a -> D10 a
D10_Unsafe (Int -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Char -> Int
ord Char
x Int -> Int -> Int
forall a. Num a => a -> a -> a
P.- Char -> Int
ord Char
'0')))
| Bool
otherwise = [Char] -> m (D10 a)
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail [Char]
"d10 must be between 0 and 9"
strD10Fail :: (Num a, MonadFail m) => String -> m (D10 a)
strD10Fail :: [Char] -> m (D10 a)
strD10Fail [Char
x] = Char -> m (D10 a)
forall a (m :: * -> *). (Num a, MonadFail m) => Char -> m (D10 a)
charD10Fail Char
x
strD10Fail [Char]
_ = [Char] -> m (D10 a)
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail [Char]
"d10 must be a single character"
strD10ListFail :: (Num a, MonadFail m) => String -> m [D10 a]
strD10ListFail :: [Char] -> m [D10 a]
strD10ListFail = (Char -> m (D10 a)) -> [Char] -> m [D10 a]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse Char -> m (D10 a)
forall a (m :: * -> *). (Num a, MonadFail m) => Char -> m (D10 a)
charD10Fail
natD10Fail :: (Num a, MonadFail m) => Natural -> m (D10 a)
natD10Fail :: Natural -> m (D10 a)
natD10Fail Natural
x =
case (Natural -> Maybe (D10 a)
forall a. Num a => Natural -> Maybe (D10 a)
natD10Maybe Natural
x) of
Just D10 a
y -> D10 a -> m (D10 a)
forall (m :: * -> *) a. Monad m => a -> m a
return D10 a
y
Maybe (D10 a)
Nothing -> [Char] -> m (D10 a)
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail [Char]
"d10 must be less than 10"
integerD10Fail :: (Num a, MonadFail m) => Integer -> m (D10 a)
integerD10Fail :: Integer -> m (D10 a)
integerD10Fail Integer
x =
case (Integer -> Maybe (D10 a)
forall a. Num a => Integer -> Maybe (D10 a)
integerD10Maybe Integer
x) of
Just D10 a
y -> D10 a -> m (D10 a)
forall (m :: * -> *) a. Monad m => a -> m a
return D10 a
y
Maybe (D10 a)
Nothing -> [Char] -> m (D10 a)
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail [Char]
"d10 must be between 0 and 9"
intD10Fail :: (Num a, MonadFail m) => Int -> m (D10 a)
intD10Fail :: Int -> m (D10 a)
intD10Fail Int
x =
case (Int -> Maybe (D10 a)
forall a. Num a => Int -> Maybe (D10 a)
intD10Maybe Int
x) of
Just D10 a
y -> D10 a -> m (D10 a)
forall (m :: * -> *) a. Monad m => a -> m a
return D10 a
y
Maybe (D10 a)
Nothing -> [Char] -> m (D10 a)
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail [Char]
"d10 must be between 0 and 9"
integralD10Fail :: (Num b, Integral a, MonadFail m) => a -> m (D10 b)
integralD10Fail :: a -> m (D10 b)
integralD10Fail a
x = Integer -> m (D10 b)
forall a (m :: * -> *).
(Num a, MonadFail m) =>
Integer -> m (D10 a)
integerD10Fail (a -> Integer
forall a. Integral a => a -> Integer
toInteger a
x)
d10Exp :: Integer -> Q Exp
d10Exp :: Integer -> Q Exp
d10Exp = Integer -> Q (D10 Integer)
forall a (m :: * -> *).
(Num a, MonadFail m) =>
Integer -> m (D10 a)
integerD10Fail (Integer -> Q (D10 Integer))
-> (D10 Integer -> Q Exp) -> Integer -> Q Exp
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> D10 Integer -> Q Exp
d10Exp'
d10Exp' :: D10 Integer -> Q Exp
d10Exp' :: D10 Integer -> Q Exp
d10Exp' (D10_Unsafe Integer
x) = [| D10_Unsafe (fromInteger x) |]
d10ListExp :: String -> Q Exp
d10ListExp :: [Char] -> Q Exp
d10ListExp = [Char] -> Q [D10 Integer]
forall a (m :: * -> *). (Num a, MonadFail m) => [Char] -> m [D10 a]
strD10ListFail ([Char] -> Q [D10 Integer])
-> ([D10 Integer] -> Q Exp) -> [Char] -> Q Exp
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> [D10 Integer] -> Q Exp
d10ListExp'
d10ListExp' :: [D10 Integer] -> Q Exp
d10ListExp' :: [D10 Integer] -> Q Exp
d10ListExp' [D10 Integer]
xs = [| xs |]
d10Pat :: Integer -> Q Pat
d10Pat :: Integer -> Q Pat
d10Pat = Integer -> Q (D10 Integer)
forall a (m :: * -> *).
(Num a, MonadFail m) =>
Integer -> m (D10 a)
integerD10Fail (Integer -> Q (D10 Integer))
-> (D10 Integer -> Q Pat) -> Integer -> Q Pat
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> D10 Integer -> Q Pat
d10Pat'
d10Pat' :: D10 Integer -> Q Pat
d10Pat' :: D10 Integer -> Q Pat
d10Pat' (D10_Unsafe Integer
x) = [p| D10_Unsafe $(litP $ integerL x) |]
d10Pat'' :: Integral a => D10 a -> Q Pat
d10Pat'' :: D10 a -> Q Pat
d10Pat'' (D10_Unsafe a
x) = [p| D10_Unsafe $(litP $ integerL $ toInteger x) |]
d10ListPat :: String -> Q Pat
d10ListPat :: [Char] -> Q Pat
d10ListPat = [Char] -> Q [D10 Integer]
forall a (m :: * -> *). (Num a, MonadFail m) => [Char] -> m [D10 a]
strD10ListFail ([Char] -> Q [D10 Integer])
-> ([D10 Integer] -> Q Pat) -> [Char] -> Q Pat
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> [D10 Integer] -> Q Pat
d10ListPat'
d10ListPat' :: [D10 Integer] -> Q Pat
d10ListPat' :: [D10 Integer] -> Q Pat
d10ListPat' = (D10 Integer -> Q Pat -> Q Pat) -> Q Pat -> [D10 Integer] -> Q Pat
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\D10 Integer
x Q Pat
p -> [p| $(d10Pat'' x) : $(p) |]) [p| [] |]
d10 :: QuasiQuoter
d10 :: QuasiQuoter
d10 = QuasiQuoter :: ([Char] -> Q Exp)
-> ([Char] -> Q Pat)
-> ([Char] -> Q Type)
-> ([Char] -> Q [Dec])
-> QuasiQuoter
QuasiQuoter
{ quoteExp :: [Char] -> Q Exp
quoteExp = [Char] -> Q (D10 Integer)
forall a (m :: * -> *). (Num a, MonadFail m) => [Char] -> m (D10 a)
strD10Fail ([Char] -> Q (D10 Integer))
-> (D10 Integer -> Q Exp) -> [Char] -> Q Exp
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> D10 Integer -> Q Exp
d10Exp'
, quotePat :: [Char] -> Q Pat
quotePat = [Char] -> Q (D10 Integer)
forall a (m :: * -> *). (Num a, MonadFail m) => [Char] -> m (D10 a)
strD10Fail ([Char] -> Q (D10 Integer))
-> (D10 Integer -> Q Pat) -> [Char] -> Q Pat
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> D10 Integer -> Q Pat
d10Pat'
, quoteType :: [Char] -> Q Type
quoteType = \[Char]
_ -> [Char] -> Q Type
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail [Char]
"d10 cannot be used in a type context"
, quoteDec :: [Char] -> Q [Dec]
quoteDec = \[Char]
_ -> [Char] -> Q [Dec]
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail [Char]
"d10 cannot be used in a declaration context"
}
d10list :: QuasiQuoter
d10list :: QuasiQuoter
d10list = QuasiQuoter :: ([Char] -> Q Exp)
-> ([Char] -> Q Pat)
-> ([Char] -> Q Type)
-> ([Char] -> Q [Dec])
-> QuasiQuoter
QuasiQuoter
{ quoteExp :: [Char] -> Q Exp
quoteExp = [Char] -> Q [D10 Integer]
forall a (m :: * -> *). (Num a, MonadFail m) => [Char] -> m [D10 a]
strD10ListFail ([Char] -> Q [D10 Integer])
-> ([D10 Integer] -> Q Exp) -> [Char] -> Q Exp
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> [D10 Integer] -> Q Exp
d10ListExp'
, quotePat :: [Char] -> Q Pat
quotePat = [Char] -> Q [D10 Integer]
forall a (m :: * -> *). (Num a, MonadFail m) => [Char] -> m [D10 a]
strD10ListFail ([Char] -> Q [D10 Integer])
-> ([D10 Integer] -> Q Pat) -> [Char] -> Q Pat
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> [D10 Integer] -> Q Pat
d10ListPat'
, quoteType :: [Char] -> Q Type
quoteType = \[Char]
_ -> [Char] -> Q Type
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail [Char]
"d10list cannot be used in a type context"
, quoteDec :: [Char] -> Q [Dec]
quoteDec = \[Char]
_ -> [Char] -> Q [Dec]
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail [Char]
"d10list cannot be used in a declaration context"
}
(+) :: Integral a => D10 a -> D10 a -> D10 a
D10 a
x + :: D10 a -> D10 a -> D10 a
+ D10 a
y = Int -> D10 a
forall a. Num a => Int -> D10 a
intMod10 (D10 a -> Int
forall a. Integral a => D10 a -> Int
d10Int D10 a
x Int -> Int -> Int
forall a. Num a => a -> a -> a
P.+ D10 a -> Int
forall a. Integral a => D10 a -> Int
d10Int D10 a
y)
(-) :: Integral a => D10 a -> D10 a -> D10 a
D10 a
x - :: D10 a -> D10 a -> D10 a
- D10 a
y = Int -> D10 a
forall a. Num a => Int -> D10 a
intMod10 (D10 a -> Int
forall a. Integral a => D10 a -> Int
d10Int D10 a
x Int -> Int -> Int
forall a. Num a => a -> a -> a
P.- D10 a -> Int
forall a. Integral a => D10 a -> Int
d10Int D10 a
y)
(*) :: Integral a => D10 a -> D10 a -> D10 a
D10 a
x * :: D10 a -> D10 a -> D10 a
* D10 a
y = Int -> D10 a
forall a. Num a => Int -> D10 a
intMod10 (D10 a -> Int
forall a. Integral a => D10 a -> Int
d10Int D10 a
x Int -> Int -> Int
forall a. Num a => a -> a -> a
P.* D10 a -> Int
forall a. Integral a => D10 a -> Int
d10Int D10 a
y)