TH.Utilities

th-utilities-0.2.0.1: Collection of useful functions for use with Template Haskell

Safe Haskell | None
Language | Haskell2010

TH.Utilities

Description

Miscellaneous Template Haskell utilities, added as needed by packages in the th-utilities repo and elsewhere.

Synopsis

- 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

tyVarBndrName :: TyVarBndr -> Name #

Get the `Name` of a `TyVarBndr`

appsT :: Type -> [Type] -> Type #

unAppsT :: Type -> [Type] #

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.

typeToNamedCon :: Type -> Maybe (Name, [Type]) #

Given a `Type`, returns a `Just` value if it's a named type constructor applied to arguments. This value contains the name of the type and a list of arguments.

expectTyCon1 :: Name -> Type -> Q Type #

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) #

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`).

proxyE :: TypeQ -> ExpQ #

Given a type, construct the expression (Proxy :: Proxy ty).

everywhereButStrings :: Data a => (forall b. Data b => b -> b) -> a -> a #

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 #

Like the `everywhereM` generic traversal strategy, but skips over strings. This can aid performance of TH traversals quite a bit.

toSimpleName :: Name -> Name #

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 #

Construct a plain name (`mkName`) based on the given name. This is useful for cases where TH doesn't expect a unique name.

freeVarsT :: Type -> [Name] #

Get the free type variables of a `Type`.

plainInstanceD :: Cxt -> Type -> [Dec] -> Dec #

Utility to conveniently handle change to `InstanceD` API in template-haskell-2.11.0

fromPlainInstanceD :: Dec -> Maybe (Cxt, Type, [Dec]) #

Utility to conveniently handle change to `InstanceD` API in template-haskell-2.11.0

typeRepToType :: TypeRep -> Q Type #

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.

data ExpLifter #

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.

Constructors

ExpLifter ExpQ |

Instances

Lift ExpLifter # |
Methods lift :: ExpLifter -> Q Exp #