row-types-1.0.0.0: Open Records and Variants

Safe HaskellNone
LanguageHaskell2010

Data.Row.Internal

Contents

Description

This module implements the internals of open records and variants.

Synopsis

Rows

newtype Row a Source #

The kind of rows. This type is only used as a datakind. A row is a typelevel entity telling us which symbols are associated with which types.

Constructors

R [LT a]

A row is a list of symbol-to-type pairs that should always be sorted lexically by the symbol. The constructor is exported here (because this is an internal module) but should not be exported elsewhere.

data Label (s :: Symbol) Source #

A label

Constructors

Label 
Instances
x y => IsLabel x (Label y) Source # 
Instance details

Defined in Data.Row.Internal

Methods

fromLabel :: Label y #

Eq (Label s) Source # 
Instance details

Defined in Data.Row.Internal

Methods

(==) :: Label s -> Label s -> Bool #

(/=) :: Label s -> Label s -> Bool #

KnownSymbol s => Show (Label s) Source # 
Instance details

Defined in Data.Row.Internal

Methods

showsPrec :: Int -> Label s -> ShowS #

show :: Label s -> String #

showList :: [Label s] -> ShowS #

class KnownSymbol (n :: Symbol) #

This class gives the string associated with a type-level symbol. There are instances of the class for every concrete literal: "hello", etc.

Since: base-4.7.0.0

Minimal complete definition

symbolSing

data LT a Source #

The kind of elements of rows. Each element is a label and its associated type.

Constructors

Symbol :-> a 
Instances
(KnownSymbol ℓ, c τ1 τ2, BiForall (R ρ1) (R ρ2) c, FrontExtends ℓ τ1 (R ρ1), FrontExtends ℓ τ2 (R ρ2), AllUniqueLabels (Extend ℓ τ1 (R ρ1)), AllUniqueLabels (Extend ℓ τ2 (R ρ2))) => BiForall (R ((ℓ :-> τ1) ': ρ1) :: Row k1) (R ((ℓ :-> τ2) ': ρ2) :: Row k2) (c :: k1 -> k2 -> Constraint) Source # 
Instance details

Defined in Data.Row.Internal

Methods

biMetamorph :: Bifunctor p => Proxy (Proxy h, Proxy p) -> (f Empty Empty -> g Empty Empty) -> (forall (ℓ0 :: Symbol) (τ10 :: k10) (τ20 :: k20) (ρ10 :: Row k10) (ρ20 :: Row k20). (KnownSymbol ℓ0, c τ10 τ20, HasType ℓ0 τ10 ρ10, HasType ℓ0 τ20 ρ20) => Label ℓ0 -> f ρ10 ρ20 -> p (f (ρ10 .- ℓ0) (ρ20 .- ℓ0)) (h τ10 τ20)) -> (forall (ℓ1 :: Symbol) (τ11 :: k10) (τ21 :: k20) (ρ11 :: Row k10) (ρ21 :: Row k20). (KnownSymbol ℓ1, c τ11 τ21, FrontExtends ℓ1 τ11 ρ11, FrontExtends ℓ1 τ21 ρ21, AllUniqueLabels (Extend ℓ1 τ11 ρ11), AllUniqueLabels (Extend ℓ1 τ21 ρ21)) => Label ℓ1 -> p (g ρ11 ρ21) (h τ11 τ21) -> g (Extend ℓ1 τ11 ρ11) (Extend ℓ1 τ21 ρ21)) -> f (R ((ℓ :-> τ1) ': ρ1)) (R ((ℓ :-> τ2) ': ρ2)) -> g (R ((ℓ :-> τ1) ': ρ1)) (R ((ℓ :-> τ2) ': ρ2)) Source #

BiForall (R ([] :: [LT k1]) :: Row k1) (R ([] :: [LT k2]) :: Row k2) (c1 :: k1 -> k2 -> Constraint) Source # 
Instance details

Defined in Data.Row.Internal

Methods

biMetamorph :: Bifunctor p => Proxy (Proxy h, Proxy p) -> (f Empty Empty -> g Empty Empty) -> (forall (ℓ :: Symbol) (τ1 :: k10) (τ2 :: k20) (ρ1 :: Row k10) (ρ2 :: Row k20). (KnownSymbol ℓ, c1 τ1 τ2, HasType ℓ τ1 ρ1, HasType ℓ τ2 ρ2) => Label ℓ -> f ρ1 ρ2 -> p (f (ρ1 .- ℓ) (ρ2 .- ℓ)) (h τ1 τ2)) -> (forall (ℓ :: Symbol) (τ1 :: k10) (τ2 :: k20) (ρ1 :: Row k10) (ρ2 :: Row k20). (KnownSymbol ℓ, c1 τ1 τ2, FrontExtends ℓ τ1 ρ1, FrontExtends ℓ τ2 ρ2, AllUniqueLabels (Extend ℓ τ1 ρ1), AllUniqueLabels (Extend ℓ τ2 ρ2)) => Label ℓ -> p (g ρ1 ρ2) (h τ1 τ2) -> g (Extend ℓ τ1 ρ1) (Extend ℓ τ2 ρ2)) -> f (R []) (R []) -> g (R []) (R []) Source #

(KnownSymbol ℓ, c τ, Forall (R ρ) c, FrontExtends ℓ τ (R ρ), AllUniqueLabels (Extend ℓ τ (R ρ))) => Forall (R ((ℓ :-> τ) ': ρ) :: Row k) (c :: k -> Constraint) Source # 
Instance details

Defined in Data.Row.Internal

Methods

metamorph :: Bifunctor p => Proxy (Proxy h, Proxy p) -> (f Empty -> g Empty) -> (forall (ℓ0 :: Symbol) (τ0 :: k0) (ρ0 :: Row k0). (KnownSymbol ℓ0, c τ0, HasType ℓ0 τ0 ρ0) => Label ℓ0 -> f ρ0 -> p (f (ρ0 .- ℓ0)) (h τ0)) -> (forall (ℓ1 :: Symbol) (τ1 :: k0) (ρ1 :: Row k0). (KnownSymbol ℓ1, c τ1, FrontExtends ℓ1 τ1 ρ1, AllUniqueLabels (Extend ℓ1 τ1 ρ1)) => Label ℓ1 -> p (g ρ1) (h τ1) -> g (Extend ℓ1 τ1 ρ1)) -> f (R ((ℓ :-> τ) ': ρ)) -> g (R ((ℓ :-> τ) ': ρ)) Source #

Forall (R ([] :: [LT k]) :: Row k) (c :: k -> Constraint) Source # 
Instance details

Defined in Data.Row.Internal

Methods

metamorph :: Bifunctor p => Proxy (Proxy h, Proxy p) -> (f Empty -> g Empty) -> (forall (ℓ :: Symbol) (τ :: k0) (ρ :: Row k0). (KnownSymbol ℓ, c τ, HasType ℓ τ ρ) => Label ℓ -> f ρ -> p (f (ρ .- ℓ)) (h τ)) -> (forall (ℓ :: Symbol) (τ :: k0) (ρ :: Row k0). (KnownSymbol ℓ, c τ, FrontExtends ℓ τ ρ, AllUniqueLabels (Extend ℓ τ ρ)) => Label ℓ -> p (g ρ) (h τ) -> g (Extend ℓ τ ρ)) -> f (R []) -> g (R []) Source #

type Empty = R '[] Source #

Type level version of empty

data HideType where Source #

Elements stored in a Row type are usually hidden.

Constructors

HideType :: a -> HideType 

Row Operations

type family Extend (l :: Symbol) (a :: k) (r :: Row k) :: Row k where ... Source #

Type level Row extension

Equations

Extend l a (R x) = R (Inject (l :-> a) x) 

type family Modify (l :: Symbol) (a :: k) (r :: Row k) :: Row k where ... Source #

Type level Row modification

Equations

Modify l a (R ρ) = R (ModifyR l a ρ) 

type family Rename (l :: Symbol) (l' :: Symbol) (r :: Row k) :: Row k where ... Source #

Type level row renaming

Equations

Rename l l' r = Extend l' (r .! l) (r .- l) 

type (.==) (l :: Symbol) (a :: k) = Extend l a Empty infix 7 Source #

A type level way to create a singleton Row.

type family (r :: Row k) .! (t :: Symbol) :: k where ... infixl 5 Source #

Type level label fetching

Equations

(R r) .! l = Get l r 

type family (r :: Row k) .- (s :: Symbol) :: Row k where ... infixl 6 Source #

Type level Row element removal

Equations

(R r) .- l = R (Remove l r) 

type family (l :: Row k) .\\ (r :: Row k) :: Row k where ... infixl 6 Source #

Type level Row difference. That is, l .\\ r is the row remaining after removing any matching elements of r from l.

Equations

(R l) .\\ (R r) = R (Diff l r) 

Various row-type merges

The difference between .+ (read "append"), .\/ (read "min-join"), and .\\ (read "const-union") comes down to how duplicates are handled. In .+, the two given row-types must be entirely unique. Even the same entry in both row-types is forbidden. In .\/, this final restriction is relaxed, allowing two row-types that have no conflicts to be merged in the logical way. The .\\ operator is the most liberal, allowing any two row-types to be merged together, and whenever there is a conflict, favoring the left argument.

As examples of use:

  • .+ is used when appending two records, assuring that those two records are entirely disjoint.
  • .\/ is used when diversifying a variant, allowing some extension to the row-type so long as no original types have changed.
  • .// is used when doing record overwrite, allowing data in a record to totally overwrite what was previously there.

type family (l :: Row k) .+ (r :: Row k) :: Row k where ... infixl 6 Source #

Type level Row append

Equations

(R l) .+ (R r) = R (Merge l r) 

type family (l :: Row k) .\/ (r :: Row k) where ... infixl 6 Source #

The minimum join of the two rows.

Equations

(R l) .\/ (R r) = R (MinJoinR l r) 

type family (l :: Row k) .// (r :: Row k) where ... infixl 6 Source #

The overwriting union, where the left row overwrites the types of the right row where the labels overlap.

Equations

(R l) .// (R r) = R (ConstUnionR l r) 

Row Constraints

class Lacks (l :: Symbol) (r :: Row *) Source #

Alias for .\. It is a class rather than an alias, so that it can be partially applied.

Instances
r .\ l => Lacks l r Source # 
Instance details

Defined in Data.Row.Internal

type family (r :: Row k) .\ (l :: Symbol) :: Constraint where ... infixl 4 Source #

Does the row lack (i.e. it does not have) the specified label?

Equations

(R r) .\ l = LacksR l r r 

class (r .! l) a => HasType l a r Source #

Alias for (r .! l) ≈ a. It is a class rather than an alias, so that it can be partially applied.

Instances
(r .! l) a => HasType l (a :: k) (r :: Row k) Source # 
Instance details

Defined in Data.Row.Internal

class Forall (r :: Row k) (c :: k -> Constraint) where Source #

Any structure over a row in which every element is similarly constrained can be metamorphized into another structure over the same row.

Methods

metamorph Source #

Arguments

:: forall (p :: * -> * -> *) (f :: Row k -> *) (g :: Row k -> *) (h :: k -> *). Bifunctor p 
=> Proxy (Proxy h, Proxy p) 
-> (f Empty -> g Empty)

The way to transform the empty element

-> (forall ℓ τ ρ. (KnownSymbol ℓ, c τ, HasType ℓ τ ρ) => Label ℓ -> f ρ -> p (f (ρ .- ℓ)) (h τ))

The unfold

-> (forall ℓ τ ρ. (KnownSymbol ℓ, c τ, FrontExtends ℓ τ ρ, AllUniqueLabels (Extend ℓ τ ρ)) => Label ℓ -> p (g ρ) (h τ) -> g (Extend ℓ τ ρ))

The fold

-> f r

The input structure

-> g r 

A metamorphism is an anamorphism (an unfold) followed by a catamorphism (a fold). The parameter p describes the output of the unfold and the input of the fold. For records, p = (,), because every entry in the row will unfold to a value paired with the rest of the record. For variants, p = Either, because there will either be a value or future types to explore. Const can be useful when the types in the row are unnecessary.

Instances
(KnownSymbol ℓ, c τ, Forall (R ρ) c, FrontExtends ℓ τ (R ρ), AllUniqueLabels (Extend ℓ τ (R ρ))) => Forall (R ((ℓ :-> τ) ': ρ) :: Row k) (c :: k -> Constraint) Source # 
Instance details

Defined in Data.Row.Internal

Methods

metamorph :: Bifunctor p => Proxy (Proxy h, Proxy p) -> (f Empty -> g Empty) -> (forall (ℓ0 :: Symbol) (τ0 :: k0) (ρ0 :: Row k0). (KnownSymbol ℓ0, c τ0, HasType ℓ0 τ0 ρ0) => Label ℓ0 -> f ρ0 -> p (f (ρ0 .- ℓ0)) (h τ0)) -> (forall (ℓ1 :: Symbol) (τ1 :: k0) (ρ1 :: Row k0). (KnownSymbol ℓ1, c τ1, FrontExtends ℓ1 τ1 ρ1, AllUniqueLabels (Extend ℓ1 τ1 ρ1)) => Label ℓ1 -> p (g ρ1) (h τ1) -> g (Extend ℓ1 τ1 ρ1)) -> f (R ((ℓ :-> τ) ': ρ)) -> g (R ((ℓ :-> τ) ': ρ)) Source #

Forall (R ([] :: [LT k]) :: Row k) (c :: k -> Constraint) Source # 
Instance details

Defined in Data.Row.Internal

Methods

metamorph :: Bifunctor p => Proxy (Proxy h, Proxy p) -> (f Empty -> g Empty) -> (forall (ℓ :: Symbol) (τ :: k0) (ρ :: Row k0). (KnownSymbol ℓ, c τ, HasType ℓ τ ρ) => Label ℓ -> f ρ -> p (f (ρ .- ℓ)) (h τ)) -> (forall (ℓ :: Symbol) (τ :: k0) (ρ :: Row k0). (KnownSymbol ℓ, c τ, FrontExtends ℓ τ ρ, AllUniqueLabels (Extend ℓ τ ρ)) => Label ℓ -> p (g ρ) (h τ) -> g (Extend ℓ τ ρ)) -> f (R []) -> g (R []) Source #

class BiForall (r1 :: Row k1) (r2 :: Row k2) (c :: k1 -> k2 -> Constraint) where Source #

Any structure over two rows in which the elements of each row satisfy some constraints can be metamorphized into another structure over both of the rows.

Methods

biMetamorph :: forall (p :: * -> * -> *) (f :: Row k1 -> Row k2 -> *) (g :: Row k1 -> Row k2 -> *) (h :: k1 -> k2 -> *). Bifunctor p => Proxy (Proxy h, Proxy p) -> (f Empty Empty -> g Empty Empty) -> (forall ℓ τ1 τ2 ρ1 ρ2. (KnownSymbol ℓ, c τ1 τ2, HasType ℓ τ1 ρ1, HasType ℓ τ2 ρ2) => Label ℓ -> f ρ1 ρ2 -> p (f (ρ1 .- ℓ) (ρ2 .- ℓ)) (h τ1 τ2)) -> (forall ℓ τ1 τ2 ρ1 ρ2. (KnownSymbol ℓ, c τ1 τ2, FrontExtends ℓ τ1 ρ1, FrontExtends ℓ τ2 ρ2, AllUniqueLabels (Extend ℓ τ1 ρ1), AllUniqueLabels (Extend ℓ τ2 ρ2)) => Label ℓ -> p (g ρ1 ρ2) (h τ1 τ2) -> g (Extend ℓ τ1 ρ1) (Extend ℓ τ2 ρ2)) -> f r1 r2 -> g r1 r2 Source #

A metamorphism is an anamorphism (an unfold) followed by a catamorphism (a fold).

Instances
(KnownSymbol ℓ, c τ1 τ2, BiForall (R ρ1) (R ρ2) c, FrontExtends ℓ τ1 (R ρ1), FrontExtends ℓ τ2 (R ρ2), AllUniqueLabels (Extend ℓ τ1 (R ρ1)), AllUniqueLabels (Extend ℓ τ2 (R ρ2))) => BiForall (R ((ℓ :-> τ1) ': ρ1) :: Row k1) (R ((ℓ :-> τ2) ': ρ2) :: Row k2) (c :: k1 -> k2 -> Constraint) Source # 
Instance details

Defined in Data.Row.Internal

Methods

biMetamorph :: Bifunctor p => Proxy (Proxy h, Proxy p) -> (f Empty Empty -> g Empty Empty) -> (forall (ℓ0 :: Symbol) (τ10 :: k10) (τ20 :: k20) (ρ10 :: Row k10) (ρ20 :: Row k20). (KnownSymbol ℓ0, c τ10 τ20, HasType ℓ0 τ10 ρ10, HasType ℓ0 τ20 ρ20) => Label ℓ0 -> f ρ10 ρ20 -> p (f (ρ10 .- ℓ0) (ρ20 .- ℓ0)) (h τ10 τ20)) -> (forall (ℓ1 :: Symbol) (τ11 :: k10) (τ21 :: k20) (ρ11 :: Row k10) (ρ21 :: Row k20). (KnownSymbol ℓ1, c τ11 τ21, FrontExtends ℓ1 τ11 ρ11, FrontExtends ℓ1 τ21 ρ21, AllUniqueLabels (Extend ℓ1 τ11 ρ11), AllUniqueLabels (Extend ℓ1 τ21 ρ21)) => Label ℓ1 -> p (g ρ11 ρ21) (h τ11 τ21) -> g (Extend ℓ1 τ11 ρ11) (Extend ℓ1 τ21 ρ21)) -> f (R ((ℓ :-> τ1) ': ρ1)) (R ((ℓ :-> τ2) ': ρ2)) -> g (R ((ℓ :-> τ1) ': ρ1)) (R ((ℓ :-> τ2) ': ρ2)) Source #

BiForall (R ([] :: [LT k1]) :: Row k1) (R ([] :: [LT k2]) :: Row k2) (c1 :: k1 -> k2 -> Constraint) Source # 
Instance details

Defined in Data.Row.Internal

Methods

biMetamorph :: Bifunctor p => Proxy (Proxy h, Proxy p) -> (f Empty Empty -> g Empty Empty) -> (forall (ℓ :: Symbol) (τ1 :: k10) (τ2 :: k20) (ρ1 :: Row k10) (ρ2 :: Row k20). (KnownSymbol ℓ, c1 τ1 τ2, HasType ℓ τ1 ρ1, HasType ℓ τ2 ρ2) => Label ℓ -> f ρ1 ρ2 -> p (f (ρ1 .- ℓ) (ρ2 .- ℓ)) (h τ1 τ2)) -> (forall (ℓ :: Symbol) (τ1 :: k10) (τ2 :: k20) (ρ1 :: Row k10) (ρ2 :: Row k20). (KnownSymbol ℓ, c1 τ1 τ2, FrontExtends ℓ τ1 ρ1, FrontExtends ℓ τ2 ρ2, AllUniqueLabels (Extend ℓ τ1 ρ1), AllUniqueLabels (Extend ℓ τ2 ρ2)) => Label ℓ -> p (g ρ1 ρ2) (h τ1 τ2) -> g (Extend ℓ τ1 ρ1) (Extend ℓ τ2 ρ2)) -> f (R []) (R []) -> g (R []) (R []) Source #

class (c1 x, c2 y) => BiConstraint c1 c2 x y Source #

A pair of constraints

Instances
(c1 x, c2 y) => BiConstraint (c1 :: k2 -> Constraint) (c2 :: k1 -> Constraint) (x :: k2) (y :: k1) Source # 
Instance details

Defined in Data.Row.Internal

class Unconstrained Source #

A null constraint

Instances
Unconstrained Source # 
Instance details

Defined in Data.Row.Internal

class Unconstrained1 a Source #

A null constraint of one argument

Instances
Unconstrained1 (a :: k) Source # 
Instance details

Defined in Data.Row.Internal

class Unconstrained2 a b Source #

A null constraint of two arguments

Instances
Unconstrained2 (a :: k2) (b :: k1) Source # 
Instance details

Defined in Data.Row.Internal

class FrontExtends l t r where Source #

A class wrapper for FrontExtendsDict.

Instances
(r ~ R ρ, R ((l :-> t) ': ρ) Extend l t (R ρ), AllUniqueLabelsR ((l :-> t) ': ρ)) => FrontExtends l (t :: k) (r :: Row k) Source # 
Instance details

Defined in Data.Row.Internal

data FrontExtendsDict l t r Source #

A dictionary of information that proves that extending a row-type r with a label l will necessarily put it to the front of the underlying row-type list. This is quite internal and should not generally be necessary.

Constructors

FrontExtendsDict (Dict (r ~ R ρ, R ((l :-> t) ': ρ) Extend l t (R ρ), AllUniqueLabelsR ((l :-> t) ': ρ))) 

type WellBehaved ρ = (Forall ρ Unconstrained1, AllUniqueLabels ρ) Source #

A convenient way to provide common, easy constraints

type family AllUniqueLabels (r :: Row k) :: Constraint where ... Source #

Are all of the labels in this Row unique?

Equations

AllUniqueLabels (R r) = AllUniqueLabelsR r 

type family Ap (fs :: Row (a -> b)) (r :: Row a) :: Row b where ... Source #

Take two rows with the same labels, and apply the type operator from the first row to the type of the second.

Equations

Ap (R fs) (R r) = R (ApR fs r) 

type family ApSingle (fs :: Row (a -> b)) (x :: a) :: Row b where ... Source #

Take a row of type operators and apply each to the second argument.

Equations

ApSingle (R fs) x = R (ApSingleR fs x) 

type family Zip (r1 :: Row *) (r2 :: Row *) where ... Source #

Zips two rows together to create a Row of the pairs. The two rows must have the same set of labels.

Equations

Zip (R r1) (R r2) = R (ZipR r1 r2) 

type family Map (f :: a -> b) (r :: Row a) :: Row b where ... Source #

Map a type level function over a Row.

Equations

Map f (R r) = R (MapR f r) 

type family Subset (r1 :: Row k) (r2 :: Row k) :: Constraint where ... Source #

Is the first row a subset of the second?

Equations

Subset (R r1) (R r2) = SubsetR r1 r2 

type Disjoint l r = (WellBehaved l, WellBehaved r, Subset l (l .+ r), Subset r (l .+ r), ((l .+ r) .\\ l) r, ((l .+ r) .\\ r) l) Source #

A type synonym for disjointness.

Helper functions

type family Labels (r :: Row a) where ... Source #

The labels in a Row.

Equations

Labels (R '[]) = '[] 
Labels (R ((l :-> a) ': xs)) = l ': Labels (R xs) 

labels :: forall ρ c s. (IsString s, Forall ρ c) => [s] Source #

Return a list of the labels in a row type.

labels' :: forall ρ s. (IsString s, Forall ρ Unconstrained1) => [s] Source #

Return a list of the labels in a row type and is specialized to the Unconstrained1 constraint.

show' :: (IsString s, Show a) => a -> s Source #

A helper function for showing labels

toKey :: forall s. KnownSymbol s => Label s -> Text Source #

A helper function to turn a Label directly into Text.

type (≈) a b = a ~ b infix 4 Source #

A lower fixity operator for type equality