GHC/Types/Meta.hs

    -- | Metaprogramming types
    module GHC.Types.Meta
       ( MetaRequest(..)
       , MetaHook
       , MetaResult -- data constructors not exported to ensure correct response type
       , metaRequestE
       , metaRequestP
       , metaRequestT
       , metaRequestD
       , metaRequestAW
       )
    where

    import GHC.Prelude

    import GHC.Serialized   ( Serialized )

    import GHC.Hs

    -- | The supported metaprogramming result types
    data MetaRequest
      = MetaE  (LHsExpr GhcPs   -> MetaResult)
      | MetaP  (LPat GhcPs      -> MetaResult)
      | MetaT  (LHsType GhcPs   -> MetaResult)
      | MetaD  ([LHsDecl GhcPs] -> MetaResult)
      | MetaAW (Serialized     -> MetaResult)

    -- | data constructors not exported to ensure correct result type
    data MetaResult
      = MetaResE  { unMetaResE  :: LHsExpr GhcPs   }
      | MetaResP  { unMetaResP  :: LPat GhcPs      }
      | MetaResT  { unMetaResT  :: LHsType GhcPs   }
      | MetaResD  { unMetaResD  :: [LHsDecl GhcPs] }
      | MetaResAW { unMetaResAW :: Serialized      }

    type MetaHook f = MetaRequest -> LHsExpr GhcTc -> f MetaResult

    metaRequestE :: Functor f => MetaHook f -> LHsExpr GhcTc -> f (LHsExpr GhcPs)
    metaRequestE h = fmap unMetaResE . h (MetaE MetaResE)

    metaRequestP :: Functor f => MetaHook f -> LHsExpr GhcTc -> f (LPat GhcPs)
    metaRequestP h = fmap unMetaResP . h (MetaP MetaResP)

    metaRequestT :: Functor f => MetaHook f -> LHsExpr GhcTc -> f (LHsType GhcPs)
    metaRequestT h = fmap unMetaResT . h (MetaT MetaResT)

    metaRequestD :: Functor f => MetaHook f -> LHsExpr GhcTc -> f [LHsDecl GhcPs]
    metaRequestD h = fmap unMetaResD . h (MetaD MetaResD)

    metaRequestAW :: Functor f => MetaHook f -> LHsExpr GhcTc -> f Serialized
    metaRequestAW h = fmap unMetaResAW . h (MetaAW MetaResAW)