th-abstraction-0.4.5.0: Nicer interface for reified information about data types
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 TyVarBndr s across multiple versions of the template-haskell package.

Synopsis

TyVarBndr -related types

type TyVarBndr_ flag = TyVarBndr Source #

A type synonym for TyVarBndr . This is the recommended way to refer to TyVarBndr s if you wish to achieve backwards compatibility with older versions of template-haskell , where TyVarBndr lacked a flag type parameter representing its specificity (if it has one).

type TyVarBndrUnit = TyVarBndr Source #

A TyVarBndr where the specificity is irrelevant. This is used for TyVarBndr s that do not interact with visible type application.

type TyVarBndrSpec = TyVarBndr Source #

A TyVarBndr with an explicit Specificity . This is used for TyVarBndr s that interact with visible type application.

data Specificity Source #

Determines how a TyVarBndr interacts with visible type application.

Constructors

SpecifiedSpec

a . Eligible for visible type application.

InferredSpec

{a} . Not eligible for visible type application.

Instances

Instances details
Eq Specificity Source #
Instance details

Defined in Language.Haskell.TH.Datatype.TyVarBndr

Data Specificity Source #
Instance details

Defined in Language.Haskell.TH.Datatype.TyVarBndr

Methods

gfoldl :: ( forall d b. Data d => c (d -> b) -> d -> c b) -> ( forall g. g -> c g) -> Specificity -> c Specificity Source #

gunfold :: ( forall b r. Data b => c (b -> r) -> c r) -> ( forall r. r -> c r) -> Constr -> c Specificity Source #

toConstr :: Specificity -> Constr Source #

dataTypeOf :: Specificity -> DataType Source #

dataCast1 :: Typeable t => ( forall d. Data d => c (t d)) -> Maybe (c Specificity ) Source #

dataCast2 :: Typeable t => ( forall d e. ( Data d, Data e) => c (t d e)) -> Maybe (c Specificity ) Source #

gmapT :: ( forall b. Data b => b -> b) -> Specificity -> Specificity Source #

gmapQl :: (r -> r' -> r) -> r -> ( forall d. Data d => d -> r') -> Specificity -> r Source #

gmapQr :: forall r r'. (r' -> r -> r) -> r -> ( forall d. Data d => d -> r') -> Specificity -> r Source #

gmapQ :: ( forall d. Data d => d -> u) -> Specificity -> [u] Source #

gmapQi :: Int -> ( forall d. Data d => d -> u) -> Specificity -> u Source #

gmapM :: Monad m => ( forall d. Data d => d -> m d) -> Specificity -> m Specificity Source #

gmapMp :: MonadPlus m => ( forall d. Data d => d -> m d) -> Specificity -> m Specificity Source #

gmapMo :: MonadPlus m => ( forall d. Data d => d -> m d) -> Specificity -> m Specificity Source #

Ord Specificity Source #
Instance details

Defined in Language.Haskell.TH.Datatype.TyVarBndr

Show Specificity Source #
Instance details

Defined in Language.Haskell.TH.Datatype.TyVarBndr

Generic Specificity Source #
Instance details

Defined in Language.Haskell.TH.Datatype.TyVarBndr

type Rep Specificity Source #
Instance details

Defined in Language.Haskell.TH.Datatype.TyVarBndr

type Rep Specificity = D1 (' MetaData "Specificity" "Language.Haskell.TH.Datatype.TyVarBndr" "th-abstraction-0.4.5.0-5FJn7J8olWl86u7LlC8Lif" ' False ) ( C1 (' MetaCons "SpecifiedSpec" ' PrefixI ' False ) ( U1 :: Type -> Type ) :+: C1 (' MetaCons "InferredSpec" ' PrefixI ' False ) ( U1 :: Type -> Type ))

Constructing TyVarBndr s

flag -polymorphic

plainTVFlag :: Name -> flag -> TyVarBndr_ flag Source #

Construct a PlainTV with the given flag .

kindedTVFlag :: Name -> flag -> Kind -> TyVarBndr_ flag Source #

Construct a KindedTV with the given flag .

TyVarBndrUnit

TyVarBndrSpec

Constructing Specificity

Modifying TyVarBndr s

elimTV :: ( Name -> r) -> ( Name -> Kind -> r) -> TyVarBndr_ flag -> r Source #

Case analysis for a TyVarBndr . If the value is a PlainTV n _ , apply the first function to n ; if it is KindedTV n _ k , apply the second function to n and k .

mapTV :: ( Name -> Name ) -> (flag -> flag') -> ( Kind -> Kind ) -> TyVarBndr_ flag -> TyVarBndr_ flag' Source #

Map over the components of a TyVarBndr .

mapTVFlag :: (flag -> flag') -> TyVarBndr_ flag -> TyVarBndr_ flag' Source #

Map over the flag of a TyVarBndr .

traverseTV :: Applicative f => ( Name -> f Name ) -> (flag -> f flag') -> ( Kind -> f Kind ) -> TyVarBndr_ flag -> f ( TyVarBndr_ flag') Source #

Traverse the components of a TyVarBndr .

traverseTVFlag :: Applicative f => (flag -> f flag') -> TyVarBndr_ flag -> f ( TyVarBndr_ flag') Source #

Traverse the flag of a TyVarBndr .

mapMTV :: Monad m => ( Name -> m Name ) -> (flag -> m flag') -> ( Kind -> m Kind ) -> TyVarBndr_ flag -> m ( TyVarBndr_ flag') Source #

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

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

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

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] Source #

Set the flag in a list of TyVarBndr s. This is often useful in contexts where one needs to re-use a list of TyVarBndr s from one flag setting to another flag setting. For example, in order to re-use the TyVarBndr s bound by a DataD in a ForallT , one can do the following:

case x of
  DataD _ _ tvbs _ _ _ ->
    ForallT (changeTVFlags SpecifiedSpec tvbs) ...

Properties of TyVarBndr s

tvName :: TyVarBndr_ flag -> Name Source #

Extract the type variable name from a TyVarBndr , ignoring the kind signature if one exists.

tvKind :: TyVarBndr_ flag -> Kind Source #

Extract the kind from a TyVarBndr . Assumes PlainTV has kind * .