generic-data-0.9.2.0: Deriving instances with GHC.Generics and related utilities
Safe HaskellSafe-Inferred
LanguageHaskell2010

Generic.Data.Internal.Meta

Description

Type metadata accessors

Type names, constructor names...

Warning

This is an internal module: it is not subject to any versioning policy, breaking changes can happen at any time.

If something here seems useful, please report it or create a pull request to export it from an external module.

Synopsis

Documentation

>>> :set -XDataKinds -XTypeApplications
>>> import Control.Applicative (ZipList)
>>> import Data.Monoid (Sum(..))

gdatatypeName :: forall a. (Generic a, GDatatype (Rep a)) => String Source #

Name of the first data constructor in a type as a string.

>>> gdatatypeName @(Maybe Int)
"Maybe"

gmoduleName :: forall a. (Generic a, GDatatype (Rep a)) => String Source #

Name of the module where the first type constructor is defined.

>>> gmoduleName @(ZipList Int)
"Control.Applicative"

gpackageName :: forall a. (Generic a, GDatatype (Rep a)) => String Source #

Name of the package where the first type constructor is defined.

>>> gpackageName @(Maybe Int)
"base"

gisNewtype :: forall a. (Generic a, GDatatype (Rep a)) => Bool Source #

True if the first type constructor is a newtype.

>>> gisNewtype @[Int]
False
>>> gisNewtype @(ZipList Int)
True

fromDatatype :: forall d r. Datatype d => (M1 D d Proxy () -> r) -> r Source #

class GDatatype f where Source #

Generic representations that contain datatype metadata.

Instances

Instances details
Datatype d => GDatatype (M1 D d f :: k -> Type) Source # 
Instance details

Defined in Generic.Data.Internal.Meta

gconName :: forall a. Constructors a => a -> String Source #

Name of the first constructor in a value.

>>> gconName (Just 0)
"Just"

gconFixity :: forall a. Constructors a => a -> Fixity Source #

The fixity of the first constructor.

>>> gconFixity (Just 0)
Prefix
>>> gconFixity ([] :*: id)
Infix RightAssociative 6

gconIsRecord :: forall a. Constructors a => a -> Bool Source #

True if the constructor is a record.

>>> gconIsRecord (Just 0)
False
>>> gconIsRecord (Sum 0)   -- Note:  newtype Sum a = Sum { getSum :: a }
True

gconNum :: forall a. Constructors a => Int Source #

Number of constructors.

>>> gconNum @(Maybe Int)
2

gconIndex :: forall a. Constructors a => a -> Int Source #

Index of a constructor.

>>> gconIndex Nothing
0
>>> gconIndex (Just "test")
1

newtype ConId a Source #

An opaque identifier for a constructor.

Constructors

ConId Int 

Instances

Instances details
Eq (ConId a) Source # 
Instance details

Defined in Generic.Data.Internal.Meta

Methods

(==) :: ConId a -> ConId a -> Bool #

(/=) :: ConId a -> ConId a -> Bool #

Ord (ConId a) Source # 
Instance details

Defined in Generic.Data.Internal.Meta

Methods

compare :: ConId a -> ConId a -> Ordering #

(<) :: ConId a -> ConId a -> Bool #

(<=) :: ConId a -> ConId a -> Bool #

(>) :: ConId a -> ConId a -> Bool #

(>=) :: ConId a -> ConId a -> Bool #

max :: ConId a -> ConId a -> ConId a #

min :: ConId a -> ConId a -> ConId a #

Show (ConId a) Source # 
Instance details

Defined in Generic.Data.Internal.Meta

Methods

showsPrec :: Int -> ConId a -> ShowS #

show :: ConId a -> String #

showList :: [ConId a] -> ShowS #

conId :: forall a. Constructors a => a -> ConId a Source #

Identifier of a constructor.

conIdToInt :: forall a. ConId a -> Int Source #

Index of a constructor, given its identifier. See also gconIndex.

conIdToString :: forall a. Constructors a => ConId a -> String Source #

Name of a constructor. See also gconName.

conIdEnum :: forall a. Constructors a => [ConId a] Source #

All constructor identifiers.

gconNum @a = length (conIdEnum @a)

conIdMin :: forall a. (Constructors a, NonEmptyType "conIdMin" a) => ConId a Source #

The first constructor. This must not be called on an empty type.

conIdMax :: forall a. (Constructors a, NonEmptyType "conIdMax" a) => ConId a Source #

The last constructor. This must not be called on an empty type.

conIdNamed :: forall s a. ConIdNamed s a => ConId a Source #

Get a ConId by name.

>>> conIdNamed @"Nothing" :: ConId (Maybe Int)
ConId 0
>>> conIdNamed @"Just"    :: ConId (Maybe Int)
ConId 1

class (Generic a, GConstructors (Rep a)) => Constructors a Source #

Constraint synonym for Generic and GConstructors.

Instances

Instances details
(Generic a, GConstructors (Rep a)) => Constructors a Source # 
Instance details

Defined in Generic.Data.Internal.Meta

class (Generic a, KnownNat (ConIdNamed' n a)) => ConIdNamed n a Source #

Constraint synonym for generic types a with a constructor named n.

Instances

Instances details
(Generic a, KnownNat (ConIdNamed' n a)) => ConIdNamed n a Source # 
Instance details

Defined in Generic.Data.Internal.Meta

Constructor information on generic representations

newtype GConId r Source #

Constructors

GConId Int 

Instances

Instances details
Eq (GConId r) Source # 
Instance details

Defined in Generic.Data.Internal.Meta

Methods

(==) :: GConId r -> GConId r -> Bool #

(/=) :: GConId r -> GConId r -> Bool #

Ord (GConId r) Source # 
Instance details

Defined in Generic.Data.Internal.Meta

Methods

compare :: GConId r -> GConId r -> Ordering #

(<) :: GConId r -> GConId r -> Bool #

(<=) :: GConId r -> GConId r -> Bool #

(>) :: GConId r -> GConId r -> Bool #

(>=) :: GConId r -> GConId r -> Bool #

max :: GConId r -> GConId r -> GConId r #

min :: GConId r -> GConId r -> GConId r #

toConId :: forall a. Generic a => GConId (Rep a) -> ConId a Source #

fromConId :: forall a. Generic a => ConId a -> GConId (Rep a) Source #

gConIdMin :: forall r. GConstructors r => GConId r Source #

gConIdMax :: forall r. GConstructors r => GConId r Source #

class GConstructors r where Source #

Generic representations that contain constructor metadata.

Instances

Instances details
GConstructors (V1 :: k -> Type) Source # 
Instance details

Defined in Generic.Data.Internal.Meta

Methods

gConIdToString :: GConId V1 -> String Source #

gConId :: forall (p :: k0). V1 p -> GConId V1 Source #

gConNum :: Int Source #

gConFixity :: forall (p :: k0). V1 p -> Fixity Source #

gConIsRecord :: forall (p :: k0). V1 p -> Bool Source #

(GConstructors f, GConstructors g) => GConstructors (f :+: g :: k -> Type) Source # 
Instance details

Defined in Generic.Data.Internal.Meta

Methods

gConIdToString :: GConId (f :+: g) -> String Source #

gConId :: forall (p :: k0). (f :+: g) p -> GConId (f :+: g) Source #

gConNum :: Int Source #

gConFixity :: forall (p :: k0). (f :+: g) p -> Fixity Source #

gConIsRecord :: forall (p :: k0). (f :+: g) p -> Bool Source #

Constructor c => GConstructors (M1 C c f :: k -> Type) Source # 
Instance details

Defined in Generic.Data.Internal.Meta

Methods

gConIdToString :: GConId (M1 C c f) -> String Source #

gConId :: forall (p :: k0). M1 C c f p -> GConId (M1 C c f) Source #

gConNum :: Int Source #

gConFixity :: forall (p :: k0). M1 C c f p -> Fixity Source #

gConIsRecord :: forall (p :: k0). M1 C c f p -> Bool Source #

GConstructors f => GConstructors (M1 D c f :: k -> Type) Source # 
Instance details

Defined in Generic.Data.Internal.Meta

Methods

gConIdToString :: GConId (M1 D c f) -> String Source #

gConId :: forall (p :: k0). M1 D c f p -> GConId (M1 D c f) Source #

gConNum :: Int Source #

gConFixity :: forall (p :: k0). M1 D c f p -> Fixity Source #

gConIsRecord :: forall (p :: k0). M1 D c f p -> Bool Source #

Find a constructor tag by name

type family GConIdNamed' (n :: Symbol) (f :: k -> *) (i :: Nat) (o :: Maybe Nat) :: Maybe Nat where ... Source #

Equations

GConIdNamed' n (M1 D _c f) i r = GConIdNamed' n f i r 
GConIdNamed' n (f :+: g) i r = GConIdNamed' n f i (GConIdNamed' n g (i + NConstructors f) r) 
GConIdNamed' n (M1 C ('MetaCons n _f _s) _g) i _r = 'Just i 
GConIdNamed' n (M1 C ('MetaCons _n _f _s) _g) _i r = r 
GConIdNamed' _n V1 _i r = r 

type family GConIdNamedIf (n :: Symbol) (t :: *) (o :: Maybe Nat) :: Nat where ... Source #

Equations

GConIdNamedIf _n _t ('Just i) = i 
GConIdNamedIf n t 'Nothing = TypeError ((('Text "No constructor named " :<>: 'ShowType n) :<>: 'Text " in generic type ") :<>: 'ShowType t) 

Check that a type is not empty

class NonEmptyType_ fname a => NonEmptyType fname a Source #

Constraint that a generic type a is not empty. Producing an error message otherwise.

The Symbol parameter fname is used only for error messages.

It is implied by the simpler constraint IsEmptyType a ~ 'False

Instances

Instances details
NonEmptyType_ fname a => NonEmptyType fname a Source # 
Instance details

Defined in Generic.Data.Internal.Meta

type NonEmptyType_ fname a = ErrorIfEmpty fname a (IsEmptyType a) ~ '() Source #

Internal definition of NonEmptyType. It is implied by the simpler constraint IsEmptyType a ~ 'False.

>>> :set -XTypeFamilies
>>> :{
conIdMin' :: (Constructors a, IsEmptyType a ~ 'False) => ConId a
conIdMin' = conIdMin
:}
>>> :{
conIdMax' :: (Constructors a, IsEmptyType a ~ 'False) => ConId a
conIdMax' = conIdMax
:}

type family GIsEmptyType (r :: k -> *) :: Bool where ... Source #

Equations

GIsEmptyType (M1 D _d V1) = 'True 
GIsEmptyType (M1 D _d (M1 C _c _f)) = 'False 
GIsEmptyType (M1 D _d (_f :+: _g)) = 'False 

type IsEmptyType a = IsEmptyType_ a Source #

True if the generic type a is empty.

type IsEmptyType_ a = GIsEmptyType (Rep a) Source #

Internal definition of IsEmptyType.

type family ErrorIfEmpty (fname :: Symbol) (a :: *) (b :: Bool) :: () where ... Source #

Throw an error if the boolean b is true, meaning that the type a is empty.

Example:

ghci> data E deriving Generic
ghci> conIdMin :: ConId E

Error message:

The function 'conIdMin' cannot be used with the empty type E

Equations

ErrorIfEmpty fname a 'True = TypeError ((('Text "The function '" :<>: 'Text fname) :<>: 'Text "' cannot be used with the empty type ") :<>: 'ShowType a) 
ErrorIfEmpty fname a 'False = '() 

Type families

type family MetaOf (f :: * -> *) :: Meta where ... Source #

Meta field of the M1 type constructor.

Equations

MetaOf (M1 i d f) = d 

type family MetaDataName (m :: Meta) :: Symbol where ... Source #

Name of the data type (MetaData).

Equations

MetaDataName ('MetaData n _m _p _nt) = n 

type family MetaDataModule (m :: Meta) :: Symbol where ... Source #

Name of the module where the data type is defined (MetaData)

Equations

MetaDataModule ('MetaData _n m _p _nt) = m 

type family MetaDataPackage (m :: Meta) :: Symbol where ... Source #

Name of the package where the data type is defined (MetaData)

Equations

MetaDataPackage ('MetaData _n _m p _nt) = p 

type family MetaDataNewtype (m :: Meta) :: Bool where ... Source #

True if the data type is a newtype (MetaData).

Equations

MetaDataNewtype ('MetaData _n _m _p nt) = nt 

type family MetaConsName (m :: Meta) :: Symbol where ... Source #

Name of the constructor (MetaCons).

Equations

MetaConsName ('MetaCons n _f _s) = n 

type family MetaConsFixity (m :: Meta) :: FixityI where ... Source #

Fixity of the constructor (MetaCons).

Equations

MetaConsFixity ('MetaCons _n f s) = f 

type family MetaConsRecord (m :: Meta) :: Bool where ... Source #

True for a record constructor (MetaCons).

Equations

MetaConsRecord ('MetaCons _n _f s) = s 

type family MetaSelNameM (m :: Meta) :: Maybe Symbol where ... Source #

Just the name of the record field, if it is one (MetaSel).

Equations

MetaSelNameM ('MetaSel mn _su _ss _ds) = mn 

type family MetaSelName (m :: Meta) :: Symbol where ... Source #

Name of the record field; undefined for non-record fields (MetaSel).

Equations

MetaSelName ('MetaSel ('Just n) _su _ss _ds) = n 

type family MetaSelUnpack (m :: Meta) :: SourceUnpackedness where ... Source #

Unpackedness annotation of a field (MetaSel).

Equations

MetaSelUnpack ('MetaSel _mn su _ss _ds) = su 

type family MetaSelSourceStrictness (m :: Meta) :: SourceStrictness where ... Source #

Strictness annotation of a field (MetaSel).

Equations

MetaSelSourceStrictness ('MetaSel _mn _su ss _ds) = ss 

type family MetaSelStrictness (m :: Meta) :: DecidedStrictness where ... Source #

Inferred strictness of a field (MetaSel).

Equations

MetaSelStrictness ('MetaSel _mn _su _ss ds) = ds 

type DummyMeta = 'MetaData "" "" "" 'False Source #

A placeholder for Meta values.

type family UnM1 (f :: k -> *) :: k -> * Source #

Remove an M1 type constructor.

Instances

Instances details
type UnM1 (M1 i c f :: k -> Type) Source # 
Instance details

Defined in Generic.Data.Internal.Meta

type UnM1 (M1 i c f :: k -> Type) = f