{-# 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 = Integer -> Q D10
forall (m :: * -> *). MonadFail m => Integer -> m D10
integerD10Fail (Integer -> Q D10) -> (D10 -> Q Exp) -> Integer -> Q Exp
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 = Name -> Q Exp
conE 'D10_Unsafe Q Exp -> Q Exp -> Q Exp
`appE` Lit -> Q Exp
litE (Char -> Lit
charL (D10 -> Char
d10Char D10
x))
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 -> Q Exp -> Q Exp) -> Q Exp -> [D10] -> Q Exp
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr
(\D10
x Q Exp
e -> Name -> Q Exp
conE '(:) Q Exp -> Q Exp -> Q Exp
`appE` D10 -> Q Exp
d10Exp' D10
x Q Exp -> Q Exp -> Q Exp
`appE` Q Exp
e)
(Name -> Q Exp
conE '[])
d10Pat :: Integer -> Q Pat
d10Pat :: Integer -> Q Pat
d10Pat = Integer -> Q D10
forall (m :: * -> *). MonadFail m => Integer -> m D10
integerD10Fail (Integer -> Q D10) -> (D10 -> Q Pat) -> Integer -> Q Pat
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 = 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 -> Q Pat) -> Q Pat -> [D10] -> Q Pat
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\D10
x Q Pat
p -> [p| $(d10Pat' x) : $(p) |]) [p| [] |]