37 lines
1.1 KiB
Haskell
37 lines
1.1 KiB
Haskell
module Rlp.TH
|
|
( rlpProg
|
|
, rlpExpr
|
|
)
|
|
where
|
|
--------------------------------------------------------------------------------
|
|
import Language.Haskell.TH
|
|
import Language.Haskell.TH.Syntax
|
|
import Language.Haskell.TH.Quote
|
|
import Data.Text (Text)
|
|
import Data.Text qualified as T
|
|
import Control.Monad.IO.Class
|
|
import Control.Monad
|
|
|
|
import Compiler.RLPC
|
|
import Rlp.AltParse
|
|
--------------------------------------------------------------------------------
|
|
|
|
rlpProg :: QuasiQuoter
|
|
rlpProg = mkqq parseRlpProgR
|
|
|
|
rlpExpr :: QuasiQuoter
|
|
rlpExpr = mkqq parseRlpExprR
|
|
|
|
mkq :: (Lift a) => (Text -> RLPCIO a) -> String -> Q Exp
|
|
mkq parse = evalAndParse >=> lift where
|
|
evalAndParse = liftIO . evalRLPCIO def . parse . T.pack
|
|
|
|
mkqq :: (Lift a) => (Text -> RLPCIO a) -> QuasiQuoter
|
|
mkqq p = QuasiQuoter
|
|
{ quoteExp = mkq p
|
|
, quotePat = error "rlp quasiquotes may only be used in expressions"
|
|
, quoteType = error "rlp quasiquotes may only be used in expressions"
|
|
, quoteDec = error "rlp quasiquotes may only be used in expressions"
|
|
}
|
|
|