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

Safe HaskellNone
LanguageHaskell2010

TH.Utilities

Description

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

Synopsis

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.

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

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

proxyE :: TypeQ -> ExpQ Source

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

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.

freeVarsT :: Type -> [Name] Source

Get the free type variables of a Type.

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

data ExpLifter Source

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