module Language.Haskell.AntiQuoter.Base(
AntiQuoterPass,
AntiQuoter,
mkQuasiQuoter,
AQResult,
fromPass, (<<>), (<>>),
extQ,
WrappedAQResult(..),
) where
import Control.Monad
import Data.Generics
import Language.Haskell.TH
import Language.Haskell.TH.Quote
infixl 1 <<>
infixr 2 <>>
type AQResult q = Maybe (Q q)
newtype WrappedAQResult q = AQRW { unAQRW :: AQResult q }
type AntiQuoterPass e q = e -> Maybe (Q q)
type AntiQuoter q = forall e. Typeable e => AntiQuoterPass e q
fromPass :: Typeable e => AntiQuoterPass e q -> AntiQuoter q
fromPass aqp = mkQ Nothing aqp
(<<>) :: Typeable e => AntiQuoter q -> AntiQuoterPass e q -> AntiQuoter q
aq <<> aqp = \e -> aq e `mplus` fromPass aqp e
(<>>) :: Typeable e => AntiQuoterPass e q -> AntiQuoter q -> AntiQuoter q
aqp <>> aq = \e -> fromPass aqp e `mplus` aq e
mkQuasiQuoter :: Data a
=> (String -> Q a)
-> AntiQuoter Exp
-> AntiQuoter Pat
-> QuasiQuoter
mkQuasiQuoter parse aqExp aqPat
= QuasiQuoter
{ quoteExp = parse >=> dataToExpQ aqExp
, quotePat = parse >=> dataToPatQ aqPat
#if MIN_VERSION_template_haskell(2,5,0)
, quoteType = error $ "Language.Haskell.Antiquoter: can't handle types"
, quoteDec = error $ "Language.Haskell.Antiquoter: can't handle decls"
#endif
}