th-abstraction-0.6.0.0: Nicer interface for reified information about data types
CopyrightEric Mertens 2020
LicenseISC
Maintaineremertens@gmail.com
Safe HaskellSafe
LanguageHaskell2010

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

TyVarBndr-related types

type TyVarBndr_ flag = TyVarBndr flag Source #

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

type TyVarBndrUnit = TyVarBndr () #

type TyVarBndrSpec = TyVarBndr Specificity #

type TyVarBndrVis = TyVarBndr BndrVis #

data Specificity #

Instances

Instances details
Data Specificity 
Instance details

Defined in Language.Haskell.TH.Syntax

Methods

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

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

toConstr :: Specificity -> Constr

dataTypeOf :: Specificity -> DataType

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

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

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

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

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

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

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

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

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

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

Generic Specificity 
Instance details

Defined in Language.Haskell.TH.Syntax

Associated Types

type Rep Specificity 
Instance details

Defined in Language.Haskell.TH.Syntax

type Rep Specificity = D1 ('MetaData "Specificity" "Language.Haskell.TH.Syntax" "template-haskell" 'False) (C1 ('MetaCons "SpecifiedSpec" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "InferredSpec" 'PrefixI 'False) (U1 :: Type -> Type))

Methods

from :: Specificity -> Rep Specificity x

to :: Rep Specificity x -> Specificity

Show Specificity 
Instance details

Defined in Language.Haskell.TH.Syntax

Methods

showsPrec :: Int -> Specificity -> ShowS

show :: Specificity -> String

showList :: [Specificity] -> ShowS

Eq Specificity 
Instance details

Defined in Language.Haskell.TH.Syntax

Methods

(==) :: Specificity -> Specificity -> Bool

(/=) :: Specificity -> Specificity -> Bool

Ord Specificity 
Instance details

Defined in Language.Haskell.TH.Syntax

DefaultBndrFlag Specificity 
Instance details

Defined in Language.Haskell.TH.Lib

PprFlag Specificity 
Instance details

Defined in Language.Haskell.TH.Ppr

Methods

pprTyVarBndr :: TyVarBndr Specificity -> Doc

type Rep Specificity 
Instance details

Defined in Language.Haskell.TH.Syntax

type Rep Specificity = D1 ('MetaData "Specificity" "Language.Haskell.TH.Syntax" "template-haskell" 'False) (C1 ('MetaCons "SpecifiedSpec" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "InferredSpec" 'PrefixI 'False) (U1 :: Type -> Type))

data BndrVis #

Constructors

BndrReq 
BndrInvis 

Instances

Instances details
Data BndrVis 
Instance details

Defined in Language.Haskell.TH.Syntax

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> BndrVis -> c BndrVis

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c BndrVis

toConstr :: BndrVis -> Constr

dataTypeOf :: BndrVis -> DataType

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c BndrVis)

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

gmapT :: (forall b. Data b => b -> b) -> BndrVis -> BndrVis

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> BndrVis -> r

gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> BndrVis -> r

gmapQ :: (forall d. Data d => d -> u) -> BndrVis -> [u]

gmapQi :: Int -> (forall d. Data d => d -> u) -> BndrVis -> u

gmapM :: Monad m => (forall d. Data d => d -> m d) -> BndrVis -> m BndrVis

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> BndrVis -> m BndrVis

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> BndrVis -> m BndrVis

Generic BndrVis 
Instance details

Defined in Language.Haskell.TH.Syntax

Associated Types

type Rep BndrVis 
Instance details

Defined in Language.Haskell.TH.Syntax

type Rep BndrVis = D1 ('MetaData "BndrVis" "Language.Haskell.TH.Syntax" "template-haskell" 'False) (C1 ('MetaCons "BndrReq" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "BndrInvis" 'PrefixI 'False) (U1 :: Type -> Type))

Methods

from :: BndrVis -> Rep BndrVis x

to :: Rep BndrVis x -> BndrVis

Show BndrVis 
Instance details

Defined in Language.Haskell.TH.Syntax

Methods

showsPrec :: Int -> BndrVis -> ShowS

show :: BndrVis -> String

showList :: [BndrVis] -> ShowS

Eq BndrVis 
Instance details

Defined in Language.Haskell.TH.Syntax

Methods

(==) :: BndrVis -> BndrVis -> Bool

(/=) :: BndrVis -> BndrVis -> Bool

Ord BndrVis 
Instance details

Defined in Language.Haskell.TH.Syntax

Methods

compare :: BndrVis -> BndrVis -> Ordering

(<) :: BndrVis -> BndrVis -> Bool

(<=) :: BndrVis -> BndrVis -> Bool

(>) :: BndrVis -> BndrVis -> Bool

(>=) :: BndrVis -> BndrVis -> Bool

max :: BndrVis -> BndrVis -> BndrVis

min :: BndrVis -> BndrVis -> BndrVis

DefaultBndrFlag BndrVis 
Instance details

Defined in Language.Haskell.TH.Lib

PprFlag BndrVis 
Instance details

Defined in Language.Haskell.TH.Ppr

Methods

pprTyVarBndr :: TyVarBndr BndrVis -> Doc

type Rep BndrVis 
Instance details

Defined in Language.Haskell.TH.Syntax

type Rep BndrVis = D1 ('MetaData "BndrVis" "Language.Haskell.TH.Syntax" "template-haskell" 'False) (C1 ('MetaCons "BndrReq" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "BndrInvis" 'PrefixI 'False) (U1 :: Type -> Type))

class DefaultBndrFlag flag where #

Methods

defaultBndrFlag :: flag #

Instances

Instances details
DefaultBndrFlag BndrVis 
Instance details

Defined in Language.Haskell.TH.Lib

DefaultBndrFlag Specificity 
Instance details

Defined in Language.Haskell.TH.Lib

DefaultBndrFlag () 
Instance details

Defined in Language.Haskell.TH.Lib

Methods

defaultBndrFlag :: () #

Constructing TyVarBndrs

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

plainTV :: DefaultBndrFlag flag => Name -> TyVarBndr flag #

kindedTV :: DefaultBndrFlag flag => Name -> Kind -> TyVarBndr flag #

TyVarBndrSpec

plainTVInferred :: Name -> TyVarBndrSpec Source #

Construct a PlainTV with an InferredSpec.

plainTVSpecified :: Name -> TyVarBndrSpec Source #

Construct a PlainTV with a SpecifiedSpec.

kindedTVInferred :: Name -> Kind -> TyVarBndrSpec Source #

Construct a KindedTV with an InferredSpec.

kindedTVSpecified :: Name -> Kind -> TyVarBndrSpec Source #

Construct a KindedTV with a SpecifiedSpec.

TyVarBndrVis

plainTVReq :: Name -> TyVarBndrVis Source #

Construct a PlainTV with a BndrReq.

plainTVInvis :: Name -> TyVarBndrVis Source #

Construct a PlainTV with a BndrInvis.

kindedTVReq :: Name -> Kind -> TyVarBndrVis Source #

Construct a KindedTV with a BndrReq.

kindedTVInvis :: Name -> Kind -> TyVarBndrVis Source #

Construct a KindedTV with a BndrInvis.

Constructing Specificity

Constructing BndrVis

Modifying TyVarBndrs

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.

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

Case analysis for a TyVarBndr that includes flags in the continuation arguments. Note that TyVarBndrs did not include flags prior to template-haskell-2.17.0.0, so on older versions of template-haskell, these flags instead become ().

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

Map over the components of a TyVarBndr.

mapTVName :: (Name -> Name) -> TyVarBndr_ flag -> TyVarBndr_ flag Source #

Map over the Name of a TyVarBndr.

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

Map over the flag of a TyVarBndr.

mapTVKind :: (Kind -> Kind) -> TyVarBndr_ flag -> TyVarBndr_ flag Source #

Map over the Kind 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.

traverseTVName :: Functor f => (Name -> f Name) -> TyVarBndr_ flag -> f (TyVarBndr_ flag) Source #

Traverse the Name of a TyVarBndr.

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

Traverse the flag of a TyVarBndr.

traverseTVKind :: Applicative f => (Kind -> f Kind) -> TyVarBndr_ flag -> f (TyVarBndr_ flag) Source #

Traverse the Kind 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 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 of
  DataD _ _ tvbs _ _ _ ->
    ForallT (changeTVFlags SpecifiedSpec tvbs) ...

Properties of TyVarBndrs

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

tvFlag :: TyVarBndr_ flag -> flag Source #

Extract the flag from a TyVarBndr. Note that TyVarBndrs did not include flags prior to template-haskell-2.17.0.0, so on older versions of template-haskell, this functions instead returns ().