| Copyright | Eric Mertens 2020 |
|---|---|
| License | ISC |
| Maintainer | emertens@gmail.com |
| Safe Haskell | Safe |
| Language | Haskell2010 |
Language.Haskell.TH.Datatype.TyVarBndr
Description
This module provides a backwards-compatible API for constructing and
manipulating TyVarBndrs across multiple versions of the template-haskell
package.
Synopsis
- type TyVarBndr_ flag = TyVarBndr
- type TyVarBndrUnit = TyVarBndr
- type TyVarBndrSpec = TyVarBndr
- data Specificity
- plainTVFlag :: Name -> flag -> TyVarBndr_ flag
- kindedTVFlag :: Name -> flag -> Kind -> TyVarBndr_ flag
- plainTV :: Name -> TyVarBndr
- kindedTV :: Name -> Kind -> TyVarBndr
- plainTVInferred :: Name -> TyVarBndrSpec
- plainTVSpecified :: Name -> TyVarBndrSpec
- kindedTVInferred :: Name -> Kind -> TyVarBndrSpec
- kindedTVSpecified :: Name -> Kind -> TyVarBndrSpec
- inferredSpec :: Specificity
- specifiedSpec :: Specificity
- elimTV :: (Name -> r) -> (Name -> Kind -> r) -> TyVarBndr_ flag -> r
- mapTV :: (Name -> Name) -> (flag -> flag') -> (Kind -> Kind) -> TyVarBndr_ flag -> TyVarBndr_ flag'
- mapTVName :: (Name -> Name) -> TyVarBndr_ flag -> TyVarBndr_ flag
- mapTVFlag :: (flag -> flag') -> TyVarBndr_ flag -> TyVarBndr_ flag'
- mapTVKind :: (Kind -> Kind) -> TyVarBndr_ flag -> TyVarBndr_ flag
- traverseTV :: Applicative f => (Name -> f Name) -> (flag -> f flag') -> (Kind -> f Kind) -> TyVarBndr_ flag -> f (TyVarBndr_ flag')
- traverseTVName :: Functor f => (Name -> f Name) -> TyVarBndr_ flag -> f (TyVarBndr_ flag)
- traverseTVFlag :: Applicative f => (flag -> f flag') -> TyVarBndr_ flag -> f (TyVarBndr_ flag')
- traverseTVKind :: Applicative f => (Kind -> f Kind) -> TyVarBndr_ flag -> f (TyVarBndr_ flag)
- mapMTV :: Monad m => (Name -> m Name) -> (flag -> m flag') -> (Kind -> m Kind) -> TyVarBndr_ flag -> m (TyVarBndr_ flag')
- mapMTVName :: Monad m => (Name -> m Name) -> TyVarBndr_ flag -> m (TyVarBndr_ flag)
- mapMTVFlag :: Monad m => (flag -> m flag') -> TyVarBndr_ flag -> m (TyVarBndr_ flag')
- mapMTVKind :: Monad m => (Kind -> m Kind) -> TyVarBndr_ flag -> m (TyVarBndr_ flag)
- changeTVFlags :: newFlag -> [TyVarBndr_ oldFlag] -> [TyVarBndr_ newFlag]
- tvName :: TyVarBndr_ flag -> Name
- tvKind :: TyVarBndr_ flag -> Kind
TyVarBndr-related types
type TyVarBndr_ flag = TyVarBndr #
type TyVarBndrUnit = TyVarBndr #
type TyVarBndrSpec = TyVarBndr #
A TyVarBndr with an explicit Specificity. This is used for
TyVarBndrs that interact with visible type application.
data Specificity #
Determines how a TyVarBndr interacts with visible type application.
Constructors
| SpecifiedSpec |
|
| InferredSpec |
|
Instances
Constructing TyVarBndrs
flag-polymorphic
plainTVFlag :: Name -> flag -> TyVarBndr_ flag #
Construct a PlainTV with the given flag.
kindedTVFlag :: Name -> flag -> Kind -> TyVarBndr_ flag #
Construct a KindedTV with the given flag.
TyVarBndrUnit
TyVarBndrSpec
plainTVInferred :: Name -> TyVarBndrSpec #
Construct a PlainTV with an InferredSpec.
plainTVSpecified :: Name -> TyVarBndrSpec #
Construct a PlainTV with a SpecifiedSpec.
kindedTVInferred :: Name -> Kind -> TyVarBndrSpec #
Construct a KindedTV with an InferredSpec.
kindedTVSpecified :: Name -> Kind -> TyVarBndrSpec #
Construct a KindedTV with a SpecifiedSpec.
Constructing Specificity
Modifying TyVarBndrs
mapTV :: (Name -> Name) -> (flag -> flag') -> (Kind -> Kind) -> TyVarBndr_ flag -> TyVarBndr_ flag' #
Map over the components of a TyVarBndr.
mapTVName :: (Name -> Name) -> TyVarBndr_ flag -> TyVarBndr_ flag #
mapTVFlag :: (flag -> flag') -> TyVarBndr_ flag -> TyVarBndr_ flag' #
Map over the flag of a TyVarBndr.
mapTVKind :: (Kind -> Kind) -> TyVarBndr_ flag -> TyVarBndr_ flag #
traverseTV :: Applicative f => (Name -> f Name) -> (flag -> f flag') -> (Kind -> f Kind) -> TyVarBndr_ flag -> f (TyVarBndr_ flag') #
Traverse the components of a TyVarBndr.
traverseTVName :: Functor f => (Name -> f Name) -> TyVarBndr_ flag -> f (TyVarBndr_ flag) #
traverseTVFlag :: Applicative f => (flag -> f flag') -> TyVarBndr_ flag -> f (TyVarBndr_ flag') #
Traverse the flag of a TyVarBndr.
traverseTVKind :: Applicative f => (Kind -> f Kind) -> TyVarBndr_ flag -> f (TyVarBndr_ flag) #
mapMTV :: Monad m => (Name -> m Name) -> (flag -> m flag') -> (Kind -> m Kind) -> TyVarBndr_ flag -> m (TyVarBndr_ flag') #
Map over the components of a TyVarBndr in a monadic fashion.
This is the same as traverseTV, but with a Monad constraint. This is
mainly useful for use with old versions of base where Applicative was
not a superclass of Monad.
mapMTVName :: Monad m => (Name -> m Name) -> TyVarBndr_ flag -> m (TyVarBndr_ flag) #
Map over the Name of a TyVarBndr in a monadic fashion.
This is the same as traverseTVName, but with a Monad constraint. This is
mainly useful for use with old versions of base where Applicative was
not a superclass of Monad.
mapMTVFlag :: Monad m => (flag -> m flag') -> TyVarBndr_ flag -> m (TyVarBndr_ flag') #
Map over the flag of a TyVarBndr in a monadic fashion.
This is the same as traverseTVFlag, but with a Monad constraint. This is
mainly useful for use with old versions of base where Applicative was
not a superclass of Monad.
mapMTVKind :: Monad m => (Kind -> m Kind) -> TyVarBndr_ flag -> m (TyVarBndr_ flag) #
Map over the Kind of a TyVarBndr in a monadic fashion.
This is the same as traverseTVKind, but with a Monad constraint. This is
mainly useful for use with old versions of base where Applicative was
not a superclass of Monad.
changeTVFlags :: newFlag -> [TyVarBndr_ oldFlag] -> [TyVarBndr_ newFlag] #
Set the flag in a list of TyVarBndrs. This is often useful in contexts
where one needs to re-use a list of TyVarBndrs from one flag setting to
another flag setting. For example, in order to re-use the TyVarBndrs bound
by a DataD in a ForallT, one can do the following:
case x ofDataD_ _ tvbs _ _ _ ->ForallT(changeTVFlagsSpecifiedSpectvbs) ...
Properties of TyVarBndrs
tvName :: TyVarBndr_ flag -> Name #
Extract the type variable name from a TyVarBndr, ignoring the
kind signature if one exists.