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

ByOtherNames

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. See ByOtherNames.Aeson for a concrete example.

Synopsis

Aliases

data Aliases rep a Source #

This datatype carries the field aliases and matches the structure of the generic Rep' shape.

Instances

Instances details
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 #

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 #

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

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 #

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

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

data AliasList names a Source #

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

aliasListBegin :: forall before a tree. AliasTree before tree '[] => AliasList before a -> Aliases tree a Source #

Define the aliases for a type by listing them.

See also alias and aliasListEnd.

alias :: forall name a names. a -> AliasList names a -> AliasList (name ': names) a Source #

Add an alias to an AliasList.

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

Rubrics

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 #

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 #

Generic helpers

class GHasDatatypeName rep where Source #

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 #

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 #

Methods

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

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

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

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 #

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 #

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 #

class GHasBranchNames rep where Source #

Instances

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

Defined in ByOtherNames.Internal

Methods

gGetBranchNames :: Aliases (left :+: right) 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 #

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 #

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

Methods

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

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

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

Instances

Instances details
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, 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 #

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 #

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 #

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