{-# language Trustworthy, TemplateHaskell #-}
module D10.Char.Splices
(
d10Exp, d10ListExp
, d10Pat, d10ListPat
) where
import D10.Char.Conversions
import D10.Char.Unsafe
import Control.Monad ((>=>))
import Language.Haskell.TH.Lib (appE, charL, conE, litE, litP)
import Language.Haskell.TH.Syntax (Exp (..), Pat (..), Q)
d10Exp :: Integer -> Q Exp
d10Exp :: Integer -> Q Exp
d10Exp = forall (m :: * -> *). MonadFail m => Integer -> m D10
integerD10Fail forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> D10 -> Q Exp
d10Exp'
d10Exp' :: D10 -> Q Exp
d10Exp' :: D10 -> Q Exp
d10Exp' D10
x = forall (m :: * -> *). Quote m => Name -> m Exp
conE 'D10_Unsafe forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` forall (m :: * -> *). Quote m => Lit -> m Exp
litE (Char -> Lit
charL (D10 -> Char
d10Char D10
x))
d10ListExp :: String -> Q Exp
d10ListExp :: String -> Q Exp
d10ListExp = forall (m :: * -> *). MonadFail m => String -> m [D10]
strD10ListFail 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' =
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr
(\D10
x Q Exp
e -> forall (m :: * -> *). Quote m => Name -> m Exp
conE '(:) forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` D10 -> Q Exp
d10Exp' D10
x forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Q Exp
e)
(forall (m :: * -> *). Quote m => Name -> m Exp
conE '[])
d10Pat :: Integer -> Q Pat
d10Pat :: Integer -> Q Pat
d10Pat = forall (m :: * -> *). MonadFail m => Integer -> m D10
integerD10Fail forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> D10 -> Q Pat
d10Pat'
d10Pat' :: D10 -> Q Pat
d10Pat' :: D10 -> Q Pat
d10Pat' (D10_Unsafe Char
x) = [p| D10_Unsafe $(litP $ charL x) |]
d10ListPat :: String -> Q Pat
d10ListPat :: String -> Q Pat
d10ListPat = forall (m :: * -> *). MonadFail m => String -> m [D10]
strD10ListFail forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\D10
x Q Pat
p -> [p| $(d10Pat' x) : $(p) |]) [p| [] |]