by-other-names-1.2.3.0: Give aliases to record fields.
Safe HaskellSafe-Inferred
LanguageHaskell2010

ByOtherNames.Internal

Description

This package provides the general mechanism for defining field and branch aliases for algebraic datatypes.

Aliases can be defined for multiple contexts (json serialization, orms...). Each of those contexts is termed a Rubric, basically a marker datakind used to namespace the aliases.

This module should only be imported if you want to define your own adapter package for some new Rubric.

Synopsis

Documentation

data Aliases rep a where Source #

This datatype carries the field/branch aliases.

It matches the structure of the generic Rep.

Constructors

Field :: KnownSymbol fieldName => a -> Aliases (S1 ('MetaSel ('Just fieldName) unpackedness strictness laziness) v) a 
Branch :: KnownSymbol branchName => a -> Aliases (C1 ('MetaCons branchName fixity sels) v) a 
FieldTree :: Aliases left a -> Aliases right a -> Aliases (left :*: right) a 
BranchTree :: Aliases left a -> Aliases right a -> Aliases (left :+: right) a 
Sum :: Aliases (left :+: right) a -> Aliases (D1 x (left :+: right)) a

We force the sum to contain at least two branches.

Record :: Aliases fields a -> Aliases (D1 x (C1 y fields)) a 

Instances

Instances details
FoldableWithIndex String (Aliases rep) Source # 
Instance details

Defined in ByOtherNames.Internal

Methods

ifoldMap :: Monoid m => (String -> a -> m) -> Aliases rep a -> m #

ifoldMap' :: Monoid m => (String -> a -> m) -> Aliases rep a -> m #

ifoldr :: (String -> a -> b -> b) -> b -> Aliases rep a -> b #

ifoldl :: (String -> b -> a -> b) -> b -> Aliases rep a -> b #

ifoldr' :: (String -> a -> b -> b) -> b -> Aliases rep a -> b #

ifoldl' :: (String -> b -> a -> b) -> b -> Aliases rep a -> b #

FunctorWithIndex String (Aliases rep) Source #

Indexed by the field or branch names.

Instance details

Defined in ByOtherNames.Internal

Methods

imap :: (String -> a -> b) -> Aliases rep a -> Aliases rep b #

TraversableWithIndex String (Aliases rep) Source # 
Instance details

Defined in ByOtherNames.Internal

Methods

itraverse :: Applicative f => (String -> a -> f b) -> Aliases rep a -> f (Aliases rep b) #

Foldable (Aliases rep) Source # 
Instance details

Defined in ByOtherNames.Internal

Methods

fold :: Monoid m => Aliases rep m -> m #

foldMap :: Monoid m => (a -> m) -> Aliases rep a -> m #

foldMap' :: Monoid m => (a -> m) -> Aliases rep a -> m #

foldr :: (a -> b -> b) -> b -> Aliases rep a -> b #

foldr' :: (a -> b -> b) -> b -> Aliases rep a -> b #

foldl :: (b -> a -> b) -> b -> Aliases rep a -> b #

foldl' :: (b -> a -> b) -> b -> Aliases rep a -> b #

foldr1 :: (a -> a -> a) -> Aliases rep a -> a #

foldl1 :: (a -> a -> a) -> Aliases rep a -> a #

toList :: Aliases rep a -> [a] #

null :: Aliases rep a -> Bool #

length :: Aliases rep a -> Int #

elem :: Eq a => a -> Aliases rep a -> Bool #

maximum :: Ord a => Aliases rep a -> a #

minimum :: Ord a => Aliases rep a -> a #

sum :: Num a => Aliases rep a -> a #

product :: Num a => Aliases rep a -> a #

Traversable (Aliases rep) Source # 
Instance details

Defined in ByOtherNames.Internal

Methods

traverse :: Applicative f => (a -> f b) -> Aliases rep a -> f (Aliases rep b) #

sequenceA :: Applicative f => Aliases rep (f a) -> f (Aliases rep a) #

mapM :: Monad m => (a -> m b) -> Aliases rep a -> m (Aliases rep b) #

sequence :: Monad m => Aliases rep (m a) -> m (Aliases rep a) #

Functor (Aliases rep) Source # 
Instance details

Defined in ByOtherNames.Internal

Methods

fmap :: (a -> b) -> Aliases rep a -> Aliases rep b #

(<$) :: a -> Aliases rep b -> Aliases rep a #

zipAliasesWith :: (a -> b -> c) -> Aliases rep a -> Aliases rep b -> Aliases rep c Source #

data AliasList names a Source #

An intermediate helper datatype for specifying the aliases. See aliasListBegin, alias and aliasListEnd.

aliasListBegin Source #

Arguments

:: forall names a rep. AliasTree names rep '[] 
=> AliasList names a

indexed by a list of names

-> Aliases rep a

indexed by a generic Rep

Define the aliases for a type by listing them.

See also alias and aliasListEnd.

The type of the argument is indexed by a list of Symbols, while the type of the result is indexed by a generic Rep.

Example for a record:

>>> :{
data Foo = Foo {aa :: Int, bb :: Bool}
  deriving (Read, Show, Generic)
fieldAliases :: Aliases (Rep Foo) String
fieldAliases = aliasListBegin $ alias @"aa" "alias1" $ alias @"bb" "alias2" $ aliasListEnd
:}

Example for a sum:

>>> :{
data Bar = Aa Int | Bb
  deriving (Read, Show, Generic)
branchAliases :: Aliases (Rep Bar) String
branchAliases = aliasListBegin $ alias @"Aa" "alias1" $ alias @"Bb" "alias2" $ aliasListEnd
:}

alias Source #

Arguments

:: forall name a names. a

The alias value

-> AliasList names a 
-> AliasList (name ': names) a 

Add an alias to an AliasList.

TYPE APPLICATION REQUIRED! You must provide the field/branch name using a type application.

class (Rubric k, Generic r) => Aliased k r where Source #

Typeclass for datatypes r that have aliases for some Rubric k.

Methods

aliases :: Aliases (Rep r) (AliasType k) Source #

class Rubric k Source #

Typeclass for marker datakinds used as rubrics, for classifying aliases according to their use.

The associated type family AliasType gives the type of the aliases.

Rubrics are needed when defining helper newtypes for use with -XDerivingVia. Because Aliases are defined at the value level, we need a way to relate the aliases with the datatype during deriving.

Associated Types

type AliasType k :: Type Source #

Instances

Instances details
Rubric 'JSON Source #

The aliases will be of type Data.Aeson.Key.

Instance details

Defined in ByOtherNames.Aeson

Associated Types

type AliasType 'JSON Source #

Generic helpers

class GHasDatatypeName rep where Source #

Given a datatype's Rep, obtain the datatype's name.

Instances

Instances details
KnownSymbol datatypeName => GHasDatatypeName (D1 ('MetaData datatypeName m p nt) (C1 y prod) :: k -> Type) Source # 
Instance details

Defined in ByOtherNames.Internal

class GHasFieldNames rep where Source #

Given a datatype's Rep, obtain its field names, assuming the datatype is a record.

Instances

Instances details
(GHasFieldNames left, GHasFieldNames right) => GHasFieldNames (left :*: right) Source # 
Instance details

Defined in ByOtherNames.Internal

Methods

gGetFieldNames :: Aliases (left :*: right) String Source #

GHasFieldNames prod => GHasFieldNames (D1 x (C1 y prod)) Source # 
Instance details

Defined in ByOtherNames.Internal

Methods

gGetFieldNames :: Aliases (D1 x (C1 y prod)) String Source #

KnownSymbol fieldName => GHasFieldNames (S1 ('MetaSel ('Just fieldName) unpackedness strictness laziness) (Rec0 v)) Source # 
Instance details

Defined in ByOtherNames.Internal

Methods

gGetFieldNames :: Aliases (S1 ('MetaSel ('Just fieldName) unpackedness strictness laziness) (Rec0 v)) String Source #

class GRecord (c :: Type -> Constraint) rep where Source #

Helper typeclass for defining typeclass instances for record types.

Parameterized by a constraint c that each field of the record must satisfy, and by the generic Rep of the record.

Methods

gToRecord Source #

Arguments

:: Applicative m 
=> Aliases rep a

Field aliases.

-> (forall v. c v => a -> m v) 
-> m (rep z) 

Builds a parser for the entire generic Rep out of parsers for each field.

gFromRecord Source #

Arguments

:: Aliases rep a

Field aliases.

-> (forall v. c v => a -> v -> o) 
-> rep z 
-> Aliases rep o 

Returns an uniform representation of each field's value in a record.

Useful for serializing.

gRecordEnum Source #

Arguments

:: Aliases rep a

Field aliases.

-> (forall v. c v => Proxy v -> o) 
-> Aliases rep (a, o) 

Decorates an Aliases value with values derived from the type of the corresponding fields.

Instances

Instances details
(GRecord c left, GRecord c right) => GRecord c (left :*: right) Source # 
Instance details

Defined in ByOtherNames.Internal

Methods

gToRecord :: Applicative m => Aliases (left :*: right) a -> (forall v. c v => a -> m v) -> m ((left :*: right) z) Source #

gFromRecord :: Aliases (left :*: right) a -> (forall v. c v => a -> v -> o) -> (left :*: right) z -> Aliases (left :*: right) o Source #

gRecordEnum :: Aliases (left :*: right) a -> (forall v. c v => Proxy v -> o) -> Aliases (left :*: right) (a, o) Source #

GRecord c prod => GRecord c (D1 x (C1 y prod)) Source # 
Instance details

Defined in ByOtherNames.Internal

Methods

gToRecord :: Applicative m => Aliases (D1 x (C1 y prod)) a -> (forall v. c v => a -> m v) -> m (D1 x (C1 y prod) z) Source #

gFromRecord :: Aliases (D1 x (C1 y prod)) a -> (forall v. c v => a -> v -> o) -> D1 x (C1 y prod) z -> Aliases (D1 x (C1 y prod)) o Source #

gRecordEnum :: Aliases (D1 x (C1 y prod)) a -> (forall v. c v => Proxy v -> o) -> Aliases (D1 x (C1 y prod)) (a, o) Source #

c v => GRecord c (S1 x (Rec0 v)) Source # 
Instance details

Defined in ByOtherNames.Internal

Methods

gToRecord :: Applicative m => Aliases (S1 x (Rec0 v)) a -> (forall v0. c v0 => a -> m v0) -> m (S1 x (Rec0 v) z) Source #

gFromRecord :: Aliases (S1 x (Rec0 v)) a -> (forall v0. c v0 => a -> v0 -> o) -> S1 x (Rec0 v) z -> Aliases (S1 x (Rec0 v)) o Source #

gRecordEnum :: Aliases (S1 x (Rec0 v)) a -> (forall v0. c v0 => Proxy v0 -> o) -> Aliases (S1 x (Rec0 v)) (a, o) Source #

class GHasBranchNames rep where Source #

Given a datatype's Rep, obtain its brach names, assuming the datatype is a sum.

Instances

Instances details
(GHasBranchNames left, GHasBranchNames right) => GHasBranchNames (left :+: right) Source # 
Instance details

Defined in ByOtherNames.Internal

Methods

gGetBranchNames :: Aliases (left :+: right) String Source #

KnownSymbol branchName => GHasBranchNames (C1 ('MetaCons branchName fixity sels) y) Source # 
Instance details

Defined in ByOtherNames.Internal

Methods

gGetBranchNames :: Aliases (C1 ('MetaCons branchName fixity sels) y) String Source #

GHasBranchNames (left :+: right) => GHasBranchNames (D1 x (left :+: right)) Source # 
Instance details

Defined in ByOtherNames.Internal

Methods

gGetBranchNames :: Aliases (D1 x (left :+: right)) String Source #

class GSum (c :: Type -> Constraint) rep where Source #

Helper typeclass for defining typeclass instances for sum types.

Parameterized by a constraint c that each field in each branch of the sum must satisfy, and by the generic Rep of the sum.

Methods

gToSum Source #

Arguments

:: (Functor n, Applicative m2) 
=> Aliases rep a

Branch aliases.

-> (forall b. a -> Slots m1 m2 b -> n b)

Convert a parser for a branch's fields into a parser for the branch.

-> (forall v. c v => m1 v)

Parser for when there's only one field in a branch.

-> (forall v. c v => m2 v)

Parser for when there's more than one field in a branch.

-> Aliases rep (n (rep z)) 

Builds a parser for the entire generic Rep.

gFromSum Source #

Arguments

:: Aliases rep a

Branch aliases.

-> (forall v. c v => v -> o) 
-> rep z 
-> (a, [o]) 

Returns the annotation corresponding to the current branch, along with an uniform representation of the branch field's values.

Useful for serializing.

gSumEnum Source #

Arguments

:: Aliases rep a

Branch aliases.

-> (forall v. c v => Proxy v -> o) 
-> Aliases rep (a, [o]) 

Decorates an Aliases value with values derived from the type of each branch's fields.

Instances

Instances details
(GSum c left, GSum c right) => GSum c (left :+: right) Source # 
Instance details

Defined in ByOtherNames.Internal

Methods

gToSum :: (Functor n, Applicative m2) => Aliases (left :+: right) a -> (forall b. a -> Slots m1 m2 b -> n b) -> (forall v. c v => m1 v) -> (forall v. c v => m2 v) -> Aliases (left :+: right) (n ((left :+: right) z)) Source #

gFromSum :: Aliases (left :+: right) a -> (forall v. c v => v -> o) -> (left :+: right) z -> (a, [o]) Source #

gSumEnum :: Aliases (left :+: right) a -> (forall v. c v => Proxy v -> o) -> Aliases (left :+: right) (a, [o]) Source #

GSumSlots c (left :*: right) => GSum c (C1 x (left :*: right)) Source # 
Instance details

Defined in ByOtherNames.Internal

Methods

gToSum :: (Functor n, Applicative m2) => Aliases (C1 x (left :*: right)) a -> (forall b. a -> Slots m1 m2 b -> n b) -> (forall v. c v => m1 v) -> (forall v. c v => m2 v) -> Aliases (C1 x (left :*: right)) (n (C1 x (left :*: right) z)) Source #

gFromSum :: Aliases (C1 x (left :*: right)) a -> (forall v. c v => v -> o) -> C1 x (left :*: right) z -> (a, [o]) Source #

gSumEnum :: Aliases (C1 x (left :*: right)) a -> (forall v. c v => Proxy v -> o) -> Aliases (C1 x (left :*: right)) (a, [o]) Source #

c v => GSum c (C1 x (S1 y (Rec0 v))) Source # 
Instance details

Defined in ByOtherNames.Internal

Methods

gToSum :: (Functor n, Applicative m2) => Aliases (C1 x (S1 y (Rec0 v))) a -> (forall b. a -> Slots m1 m2 b -> n b) -> (forall v0. c v0 => m1 v0) -> (forall v1. c v1 => m2 v1) -> Aliases (C1 x (S1 y (Rec0 v))) (n (C1 x (S1 y (Rec0 v)) z)) Source #

gFromSum :: Aliases (C1 x (S1 y (Rec0 v))) a -> (forall v0. c v0 => v0 -> o) -> C1 x (S1 y (Rec0 v)) z -> (a, [o]) Source #

gSumEnum :: Aliases (C1 x (S1 y (Rec0 v))) a -> (forall v0. c v0 => Proxy v0 -> o) -> Aliases (C1 x (S1 y (Rec0 v))) (a, [o]) Source #

GSum c (C1 x (U1 :: Type -> Type)) Source # 
Instance details

Defined in ByOtherNames.Internal

Methods

gToSum :: (Functor n, Applicative m2) => Aliases (C1 x U1) a -> (forall b. a -> Slots m1 m2 b -> n b) -> (forall v. c v => m1 v) -> (forall v. c v => m2 v) -> Aliases (C1 x U1) (n (C1 x U1 z)) Source #

gFromSum :: Aliases (C1 x U1) a -> (forall v. c v => v -> o) -> C1 x U1 z -> (a, [o]) Source #

gSumEnum :: Aliases (C1 x U1) a -> (forall v. c v => Proxy v -> o) -> Aliases (C1 x U1) (a, [o]) Source #

GSum c (left :+: right) => GSum c (D1 x (left :+: right)) Source # 
Instance details

Defined in ByOtherNames.Internal

Methods

gToSum :: (Functor n, Applicative m2) => Aliases (D1 x (left :+: right)) a -> (forall b. a -> Slots m1 m2 b -> n b) -> (forall v. c v => m1 v) -> (forall v. c v => m2 v) -> Aliases (D1 x (left :+: right)) (n (D1 x (left :+: right) z)) Source #

gFromSum :: Aliases (D1 x (left :+: right)) a -> (forall v. c v => v -> o) -> D1 x (left :+: right) z -> (a, [o]) Source #

gSumEnum :: Aliases (D1 x (left :+: right)) a -> (forall v. c v => Proxy v -> o) -> Aliases (D1 x (left :+: right)) (a, [o]) Source #

data Slots m1 m2 v Source #

Helper for defining branch parsers.

v is some part of a generic Rep, m1 is some parser type for when there's a single field in the branch, and m2 is some parser type for when there's more than one field in the branch.

m1 and m2 might be the same type.

Constructors

ZeroSlots v 
SingleSlot (m1 v) 
ManySlots (m2 v) 

Instances

Instances details
(Functor m1, Functor m2) => Functor (Slots m1 m2) Source # 
Instance details

Defined in ByOtherNames.Internal

Methods

fmap :: (a -> b) -> Slots m1 m2 a -> Slots m1 m2 b #

(<$) :: a -> Slots m1 m2 b -> Slots m1 m2 a #

(Show v, Show (m1 v), Show (m2 v)) => Show (Slots m1 m2 v) Source # 
Instance details

Defined in ByOtherNames.Internal

Methods

showsPrec :: Int -> Slots m1 m2 v -> ShowS #

show :: Slots m1 m2 v -> String #

showList :: [Slots m1 m2 v] -> ShowS #

Re-exports

data Symbol #

(Kind) This is the kind of type-level symbols. Declared here because class IP needs it

Instances

Instances details
SingKind Symbol

Since: base-4.9.0.0

Instance details

Defined in GHC.Generics

Associated Types

type DemoteRep Symbol

Methods

fromSing :: forall (a :: Symbol). Sing a -> DemoteRep Symbol

KnownSymbol a => SingI (a :: Symbol)

Since: base-4.9.0.0

Instance details

Defined in GHC.Generics

Methods

sing :: Sing a

KnownSymbol fieldName => GHasFieldNames (S1 ('MetaSel ('Just fieldName) unpackedness strictness laziness) (Rec0 v)) Source # 
Instance details

Defined in ByOtherNames.Internal

Methods

gGetFieldNames :: Aliases (S1 ('MetaSel ('Just fieldName) unpackedness strictness laziness) (Rec0 v)) String Source #

KnownSymbol fieldName => GRecord (S1 ('MetaSel ('Just fieldName) unpackedness strictness laziness) (Rec0 v)) Source # 
Instance details

Defined in ByOtherNamesH

Methods

gToRecord :: Applicative g => Aliases (S1 ('MetaSel ('Just fieldName) unpackedness strictness laziness) (Rec0 v)) a h -> (forall v0. a -> h v0 -> g v0) -> g (S1 ('MetaSel ('Just fieldName) unpackedness strictness laziness) (Rec0 v) z) Source #

gFromRecord :: S1 ('MetaSel ('Just fieldName) unpackedness strictness laziness) (Rec0 v) z -> Aliases (S1 ('MetaSel ('Just fieldName) unpackedness strictness laziness) (Rec0 v)) String Identity Source #

gBiliftA2RecordAliases :: (a1 -> a2 -> ar) -> (forall v0. h1 v0 -> h2 v0 -> hr v0) -> Aliases (S1 ('MetaSel ('Just fieldName) unpackedness strictness laziness) (Rec0 v)) a1 h1 -> Aliases (S1 ('MetaSel ('Just fieldName) unpackedness strictness laziness) (Rec0 v)) a2 h2 -> Aliases (S1 ('MetaSel ('Just fieldName) unpackedness strictness laziness) (Rec0 v)) ar hr Source #

IsRecord (M1 S ('MetaSel ('Nothing :: Maybe Symbol) u ss ds) f) False 
Instance details

Defined in Data.Aeson.Types.Generic

type DemoteRep Symbol 
Instance details

Defined in GHC.Generics

type DemoteRep Symbol = String
data Sing (s :: Symbol) 
Instance details

Defined in GHC.Generics

data Sing (s :: Symbol) where
type Compare (a :: Symbol) (b :: Symbol) 
Instance details

Defined in Data.Type.Ord

type Compare (a :: Symbol) (b :: Symbol) = CmpSymbol a b