generics-sop-0.3.2.0: Generic Programming using True Sums of Products

Safe HaskellNone
LanguageHaskell2010

Generics.SOP.Type.Metadata

Contents

Description

Type-level metadata

This module provides datatypes (to be used promoted) that can represent the metadata of Haskell datatypes on the type level.

We do not reuse the term-level metadata types, because these are GADTs that incorporate additional invariants. We could (at least in GHC 8) impose the same invariants on the type level as well, but some tests have revealed that the resulting type are rather inconvenient to work with.

So we use simple datatypes to represent the type-level metadata, even if this means that some invariants are not explicitly captured.

We establish a relation between the term- and type-level versions of the metadata by automatically computing the term-level version from the type-level version.

As we now have two versions of metadata (term-level and type-level) with very similar, yet slightly different datatype definitions, the names between the modules clash, and this module is recommended to be imported qualified when needed.

The interface exported by this module is still somewhat experimental.

Since: 0.3.0.0

Synopsis

Documentation

data DatatypeInfo Source #

Metadata for a datatype (to be used promoted).

A type of kind DatatypeInfo contains meta-information about a datatype that is not contained in its code. This information consists primarily of the names of the datatype, its constructors, and possibly its record selectors.

The constructor indicates whether the datatype has been declared using newtype or not.

Since: 0.3.0.0

data ConstructorInfo Source #

Metadata for a single constructors (to be used promoted).

Since: 0.3.0.0

Constructors

Constructor ConstructorName

Normal constructor

Infix ConstructorName Associativity Fixity

Infix constructor

Record ConstructorName [FieldInfo]

Record constructor

data FieldInfo Source #

Metadata for a single record field (to be used promoted).

Since: 0.3.0.0

Constructors

FieldInfo FieldName 

Instances

DemoteFieldInfos ([] FieldInfo) ([] *) Source # 

Methods

demoteFieldInfos :: proxy [FieldInfo] -> NP * FieldInfo [*] Source #

(DemoteFieldInfo f x, DemoteFieldInfos fs xs) => DemoteFieldInfos ((:) FieldInfo f fs) ((:) * x xs) Source # 

Methods

demoteFieldInfos :: proxy ((FieldInfo ': f) fs) -> NP * FieldInfo ((* ': x) xs) Source #

type DatatypeName = Symbol Source #

The name of a datatype.

type ModuleName = Symbol Source #

The name of a module.

type ConstructorName = Symbol Source #

The name of a data constructor.

type FieldName = Symbol Source #

The name of a field / record selector.

type Fixity = Nat Source #

The fixity of an infix constructor.

class DemoteDatatypeInfo (x :: DatatypeInfo) (xss :: [[*]]) where Source #

Class for computing term-level datatype information from type-level datatype information.

Since: 0.3.0.0

Minimal complete definition

demoteDatatypeInfo

Methods

demoteDatatypeInfo :: proxy x -> DatatypeInfo xss Source #

Given a proxy of some type-level datatype information, return the corresponding term-level information.

Since: 0.3.0.0

Instances

(KnownSymbol m, KnownSymbol d, DemoteConstructorInfos cs xss) => DemoteDatatypeInfo (ADT m d cs) xss Source # 

Methods

demoteDatatypeInfo :: proxy (ADT m d cs) -> DatatypeInfo xss Source #

(KnownSymbol m, KnownSymbol d, DemoteConstructorInfo c ((:) * x ([] *))) => DemoteDatatypeInfo (Newtype m d c) ((:) [*] ((:) * x ([] *)) ([] [*])) Source # 

Methods

demoteDatatypeInfo :: proxy (Newtype m d c) -> DatatypeInfo (([*] ': (* ': x) [*]) [[*]]) Source #

class DemoteConstructorInfos (cs :: [ConstructorInfo]) (xss :: [[*]]) where Source #

Class for computing term-level constructor information from type-level constructor information.

Since: 0.3.0.0

Minimal complete definition

demoteConstructorInfos

Methods

demoteConstructorInfos :: proxy cs -> NP ConstructorInfo xss Source #

Given a proxy of some type-level constructor information, return the corresponding term-level information as a product.

Since: 0.3.0.0

class DemoteConstructorInfo (x :: ConstructorInfo) (xs :: [*]) where Source #

Class for computing term-level constructor information from type-level constructor information.

Since: 0.3.0.0

Minimal complete definition

demoteConstructorInfo

Methods

demoteConstructorInfo :: proxy x -> ConstructorInfo xs Source #

Given a proxy of some type-level constructor information, return the corresponding term-level information.

Since: 0.3.0.0

Instances

class SListI xs => DemoteFieldInfos (fs :: [FieldInfo]) (xs :: [*]) where Source #

Class for computing term-level field information from type-level field information.

Since: 0.3.0.0

Minimal complete definition

demoteFieldInfos

Methods

demoteFieldInfos :: proxy fs -> NP FieldInfo xs Source #

Given a proxy of some type-level field information, return the corresponding term-level information as a product.

Since: 0.3.0.0

Instances

DemoteFieldInfos ([] FieldInfo) ([] *) Source # 

Methods

demoteFieldInfos :: proxy [FieldInfo] -> NP * FieldInfo [*] Source #

(DemoteFieldInfo f x, DemoteFieldInfos fs xs) => DemoteFieldInfos ((:) FieldInfo f fs) ((:) * x xs) Source # 

Methods

demoteFieldInfos :: proxy ((FieldInfo ': f) fs) -> NP * FieldInfo ((* ': x) xs) Source #

class DemoteFieldInfo (x :: FieldInfo) (a :: *) where Source #

Class for computing term-level field information from type-level field information.

Since: 0.3.0.0

Minimal complete definition

demoteFieldInfo

Methods

demoteFieldInfo :: proxy x -> FieldInfo a Source #

Given a proxy of some type-level field information, return the corresponding term-level information.

Since: 0.3.0.0

Instances

class DemoteAssociativity (a :: Associativity) where Source #

Class for computing term-level associativity information from type-level associativity information.

Since: 0.3.0.0

Minimal complete definition

demoteAssociativity

Methods

demoteAssociativity :: proxy a -> Associativity Source #

Given a proxy of some type-level associativity information, return the corresponding term-level information.

Since: 0.3.0.0

re-exports

data Associativity :: * #

Datatype to represent the associativity of a constructor

Instances

Bounded Associativity 
Enum Associativity 
Eq Associativity 
Data Associativity

Since: 4.9.0.0

Methods

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

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

toConstr :: Associativity -> Constr #

dataTypeOf :: Associativity -> DataType #

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

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

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

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

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

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

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

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

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

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

Ord Associativity 
Read Associativity 
Show Associativity 
Ix Associativity 
Generic Associativity 

Associated Types

type Rep Associativity :: * -> * #

SingKind Associativity

Since: 4.0.0.0

Associated Types

type DemoteRep Associativity :: *

Methods

fromSing :: Sing Associativity a -> DemoteRep Associativity

SingI Associativity LeftAssociative

Since: 4.9.0.0

Methods

sing :: Sing LeftAssociative a

SingI Associativity RightAssociative

Since: 4.9.0.0

Methods

sing :: Sing RightAssociative a

SingI Associativity NotAssociative

Since: 4.9.0.0

Methods

sing :: Sing NotAssociative a

type Rep Associativity 
type Rep Associativity = D1 * (MetaData "Associativity" "GHC.Generics" "base" False) ((:+:) * (C1 * (MetaCons "LeftAssociative" PrefixI False) (U1 *)) ((:+:) * (C1 * (MetaCons "RightAssociative" PrefixI False) (U1 *)) (C1 * (MetaCons "NotAssociative" PrefixI False) (U1 *))))
data Sing Associativity 
type DemoteRep Associativity 
type DemoteRep Associativity = Associativity