Safe Haskell | None |
---|---|
Language | Haskell2010 |
Miscellaneous Template Haskell utilities, added as needed by packages in the th-utilities repo and elsewhere.
- tyVarBndrName :: TyVarBndr -> Name
- appsT :: Type -> [Type] -> Type
- unAppsT :: Type -> [Type]
- typeToNamedCon :: Type -> Maybe (Name, [Type])
- expectTyCon1 :: Name -> Type -> Q Type
- expectTyCon2 :: Name -> Type -> Q (Type, Type)
- proxyE :: TypeQ -> ExpQ
- everywhereButStrings :: Data a => (forall b. Data b => b -> b) -> a -> a
- everywhereButStringsM :: forall a m. (Data a, Monad m) => GenericM m -> a -> m a
- toSimpleName :: Name -> Name
- dequalify :: Name -> Name
- freeVarsT :: Type -> [Name]
- plainInstanceD :: Cxt -> Type -> [Dec] -> Dec
- fromPlainInstanceD :: Dec -> Maybe (Cxt, Type, [Dec])
- typeRepToType :: TypeRep -> Q Type
- data ExpLifter = ExpLifter ExpQ
Documentation
unAppsT :: Type -> [Type] Source #
Breaks a type application like A b c
into [A, b, c]. In other
words, it descends leftwards down AppT
constructors, and yields a
list of the results.
expectTyCon1 :: Name -> Type -> Q Type Source #
Expect the provided type to be an application of a regular type to
one argument, otherwise fail with a message. This will also work if
the name is a promoted data constructor (PromotedT
).
expectTyCon2 :: Name -> Type -> Q (Type, Type) Source #
Expect the provided type to be an application of a regular type to
two arguments, otherwise fail with a message. This will also work if
the name is a promoted data constructor (PromotedT
).
everywhereButStrings :: Data a => (forall b. Data b => b -> b) -> a -> a Source #
Like the everywhere
generic traversal strategy, but skips over
strings. This can aid performance of TH traversals quite a bit.
everywhereButStringsM :: forall a m. (Data a, Monad m) => GenericM m -> a -> m a Source #
Like the everywhereM
generic traversal strategy, but skips over
strings. This can aid performance of TH traversals quite a bit.
toSimpleName :: Name -> Name Source #
Make a Name
with a NameS
or NameQ
flavour, from a Name
with
any NameFlavour
. This may change the meaning of names.
dequalify :: Name -> Name Source #
Construct a plain name (mkName
) based on the given name. This is
useful for cases where TH doesn't expect a unique name.
plainInstanceD :: Cxt -> Type -> [Dec] -> Dec Source #
Utility to conveniently handle change to InstanceD
API in
template-haskell-2.11.0
fromPlainInstanceD :: Dec -> Maybe (Cxt, Type, [Dec]) Source #
Utility to conveniently handle change to InstanceD
API in
template-haskell-2.11.0
typeRepToType :: TypeRep -> Q Type Source #
Utility to convert Data.Typeable TypeRep
to a Type
. Note that
this function is known to not yet work for many cases, but it does
work for normal user datatypes. In future versions this function
might have better behavior.
Hack to enable putting expressions inside lift
-ed TH data. For
example, you could do
main = print $(lift [ExpLifter [e| 1 + 1 |], ExpLifter [e| 2 |]])
Here, lift
is working on a value of type [ExpLifter]
. The code
generated by lift
constructs a list with the ExpLifter
expressions providing the element values.
Without ExpLifter
, lift
tends to just generate code involving
data construction. With ExpLifter
, you can put more complicated
expression into this construction.