module Data.String.Interpolate (
i
) where
import Language.Haskell.TH.Quote (QuasiQuoter(..))
import Language.Haskell.Meta.Parse.Careful (parseExp)
import Data.String.Interpolate.Util
import Data.String.Interpolate.Parse
import Data.String.Interpolate.Compat (Q, Exp, appE, reportError)
i :: QuasiQuoter
i = QuasiQuoter {
quoteExp = toExp . parseNodes
, quotePat = err "pattern"
, quoteType = err "type"
, quoteDec = err "declaration"
}
where
err name = error ("Data.String.Interpolate.i: This QuasiQuoter can not be used as a " ++ name ++ "!")
toExp:: [Node] -> Q Exp
toExp nodes = case nodes of
[] -> [|""|]
(x:xs) -> f x `appE` toExp xs
where
f (Literal s) = [|showString s|]
f (Expression e) = [|(showString . toString) $(reifyExpression e)|]
reifyExpression :: String -> Q Exp
reifyExpression s = case parseExp s of
Left _ -> do
reportError "Parse error in expression!"
[|""|]
Right e -> return e