Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
See here for the original term-level code by Stefan Kahrs. It is also copied at the end of this file. Some parts of the type-level code include the correspondign term-level parts in their comments.
Synopsis
- data Color
- data Map symbol q
- type Empty = E
- type family KeysValuesAllF c t :: Constraint where ...
- class KeysValuesAllF c t => KeysValuesAll (c :: symbol -> q -> Constraint) (t :: Map symbol q) where
- cpara_Map :: proxy c -> r E -> (forall left k v right color. (c k v, KeysValuesAll c left, KeysValuesAll c right) => r left -> r right -> r (N color left k v right)) -> r t
- class Maplike (t :: Map Symbol Type) where
- pure_Record :: (forall v. f v) -> Record f t
- sequence_Record :: Applicative f => Record f t -> f (Record I t)
- sequence'_Record :: Applicative f => Record (f :.: g) t -> f (Record g t)
- liftA_Record :: (forall a. f a -> g a) -> Record f t -> Record g t
- liftA2_Record :: (forall a. f a -> g a -> h a) -> Record f t -> Record g t -> Record h t
- liftA_Variant :: (forall a. f a -> g a) -> Variant f t -> Variant g t
- liftA2_Variant :: (forall a. f a -> g a -> h a) -> Record f t -> Variant g t -> Variant h t
- injections'_Variant :: Record (Case f (Variant f t)) t
- injections_Record :: Record (Case f (Endo (Record f t))) t
- collapse'_Record :: Monoid a => Record (K a) t -> a
- collapse_Variant :: Variant (K a) t -> a
- injections_Variant :: Maplike t => Record (VariantInjection f t) t
- newtype VariantInjection (f :: q -> Type) (t :: Map Symbol q) (v :: q) = VariantInjection {
- runVariantInjection :: f v -> Variant f t
- cpure_Record :: forall c t f. KeysValuesAll c t => Proxy c -> (forall k v. c k v => f v) -> Record f t
- cpure'_Record :: forall c t f. KeysValuesAll (KeyValueConstraints KnownSymbol c) t => Proxy c -> (forall v. c v => String -> f v) -> Record f t
- newtype F1 f g t = F1 {}
- cliftA_Record :: forall c t f g. KeysValuesAll c t => Proxy c -> (forall k v. c k v => f v -> g v) -> Record f t -> Record g t
- newtype F2 f g h t = F2 {}
- cliftA2_Record :: forall c t f g h. KeysValuesAll c t => Proxy c -> (forall k v. c k v => f v -> g v -> h v) -> Record f t -> Record g t -> Record h t
- demoteKeys :: forall t. KeysValuesAll KnownKey t => Record (K String) t
- class KnownSymbol k => KnownKey (k :: Symbol) (v :: q)
- demoteEntries :: forall t. KeysValuesAll KnownKeyTypeableValue t => Record (K (String, TypeRep)) t
- class (KnownSymbol k, Typeable v) => KnownKeyTypeableValue (k :: Symbol) (v :: q)
- class (kc k, vc v) => KeyValueConstraints (kc :: Symbol -> Constraint) (vc :: q -> Constraint) (k :: Symbol) (v :: q)
- class vc v => ValueConstraint (vc :: q -> Constraint) (k :: Symbol) (v :: q)
- data Record (f :: q -> Type) (t :: Map Symbol q) where
- collapse_Record :: forall t result a. Productlike '[] t result => Record (K a) t -> [a]
- prettyShow_Record :: forall t f. (Maplike t, KeysValuesAll (KeyValueConstraints KnownSymbol Show) t) => (forall x. Show x => f x -> String) -> Record f t -> String
- prettyShow_RecordI :: forall t. (Maplike t, KeysValuesAll (KeyValueConstraints KnownSymbol Show) t) => Record I t -> String
- prettyShowRecord :: forall t flat f. (KeysValuesAll KnownKey t, Productlike '[] t flat, All Show flat, SListI flat) => (forall x. Show x => f x -> String) -> Record f t -> String
- prettyShowRecordI :: forall t flat. (KeysValuesAll KnownKey t, Productlike '[] t flat, All Show flat, SListI flat) => Record I t -> String
- unit :: Record f Empty
- data Variant (f :: q -> Type) (t :: Map Symbol q) where
- impossible :: Variant f Empty -> b
- prettyShow_Variant :: forall t flat f. (Maplike t, KeysValuesAll (KeyValueConstraints KnownSymbol Show) t) => (forall x. Show x => f x -> String) -> Variant f t -> String
- prettyShow_VariantI :: forall t flat. (Maplike t, KeysValuesAll (KeyValueConstraints KnownSymbol Show) t) => Variant I t -> String
- prettyShowVariant :: forall t flat f. (KeysValuesAll KnownKey t, Productlike '[] t flat, Sumlike '[] t flat, All Show flat, SListI flat) => (forall x. Show x => f x -> String) -> Variant f t -> String
- prettyShowVariantI :: forall t flat. (KeysValuesAll KnownKey t, Productlike '[] t flat, Sumlike '[] t flat, All Show flat, SListI flat) => Variant I t -> String
- type family InsertAll (es :: [(Symbol, q)]) (t :: Map Symbol q) :: Map Symbol q where ...
- type FromList (es :: [(Symbol, q)]) = InsertAll es Empty
- insert :: forall k v t f. Insertable k v t => f v -> Record f t -> Record f (Insert k v t)
- widen :: forall k v t f. Insertable k v t => Variant f t -> Variant f (Insert k v t)
- addField :: forall k v t f. Insertable k v t => f v -> Record f t -> Record f (Insert k v t)
- insertI :: forall k v t. Insertable k v t => v -> Record I t -> Record I (Insert k v t)
- addFieldI :: forall k v t. Insertable k v t => v -> Record I t -> Record I (Insert k v t)
- class Insertable (k :: Symbol) (v :: q) (t :: Map Symbol q) where
- class CanMakeBlack (t :: Map Symbol q) where
- class InsertableHelper1 (k :: Symbol) (v :: q) (t :: Map Symbol q) where
- class InsertableHelper2 (ordering :: Ordering) (k :: Symbol) (v :: q) (color :: Color) (left :: Map Symbol q) (k' :: Symbol) (v' :: q) (right :: Map Symbol q) where
- data BalanceAction
- type family ShouldBalance (left :: Map k' v') (right :: Map k' v') :: BalanceAction where ...
- class Balanceable (left :: Map Symbol q) (k :: Symbol) (v :: q) (right :: Map Symbol q) where
- class BalanceableHelper (action :: BalanceAction) (left :: Map Symbol q) (k :: Symbol) (v :: q) (right :: Map Symbol q) where
- type family Field (f :: q -> Type) (t :: Map Symbol q) (v :: q) where ...
- type family Branch (f :: q -> Type) (t :: Map Symbol q) (v :: q) where ...
- class Key (k :: Symbol) (t :: Map Symbol q) where
- field :: forall k t f. Key k t => Field f t (Value k t)
- branch :: forall k t f. Key k t => Branch f t (Value k t)
- class KeyHelper (ordering :: Ordering) (k :: Symbol) (left :: Map Symbol q) (v :: q) (right :: Map Symbol q) where
- project :: forall k t f. Key k t => Record f t -> f (Value k t)
- getField :: forall k t f. Key k t => Record f t -> f (Value k t)
- setField :: forall k t f. Key k t => f (Value k t) -> Record f t -> Record f t
- modifyField :: forall k t f. Key k t => (f (Value k t) -> f (Value k t)) -> Record f t -> Record f t
- inject :: forall k t f. Key k t => f (Value k t) -> Variant f t
- match :: forall k t f. Key k t => Variant f t -> Maybe (f (Value k t))
- projectI :: forall k t. Key k t => Record I t -> Value k t
- getFieldI :: forall k t. Key k t => Record I t -> Value k t
- setFieldI :: forall k t. Key k t => Value k t -> Record I t -> Record I t
- modifyFieldI :: forall k t. Key k t => (Value k t -> Value k t) -> Record I t -> Record I t
- injectI :: forall k t. Key k t => Value k t -> Variant I t
- matchI :: forall k t. Key k t => Variant I t -> Maybe (Value k t)
- eliminate :: (Productlike '[] t result, Sumlike '[] t result, SListI result) => Record (Case f r) t -> Variant f t -> r
- eliminate_Variant :: Maplike t => Record (Case f r) t -> Variant f t -> r
- newtype Case f a b = Case {
- runCase :: f b -> a
- addCase :: forall k v t f a. Insertable k v t => (f v -> a) -> Record (Case f a) t -> Record (Case f a) (Insert k v t)
- addCaseI :: forall k v t a. Insertable k v t => (v -> a) -> Record (Case I a) t -> Record (Case I a) (Insert k v t)
- newtype SetField f a b = SetField {
- getSetField :: f b -> a -> a
- class (Key k t, Value k t ~ v) => PresentIn (t :: Map Symbol q) (k :: Symbol) (v :: q)
- type ProductlikeSubset (subset :: Map Symbol q) (whole :: Map Symbol q) (flat :: [q]) = (KeysValuesAll (PresentIn whole) subset, Productlike '[] subset flat, SListI flat)
- fieldSubset :: forall subset whole flat f. ProductlikeSubset subset whole flat => Record f whole -> (Record f subset -> Record f whole, Record f subset)
- projectSubset :: forall subset whole flat f. ProductlikeSubset subset whole flat => Record f whole -> Record f subset
- getFieldSubset :: forall subset whole flat f. ProductlikeSubset subset whole flat => Record f whole -> Record f subset
- setFieldSubset :: forall subset whole flat f. ProductlikeSubset subset whole flat => Record f subset -> Record f whole -> Record f whole
- modifyFieldSubset :: forall subset whole flat f. ProductlikeSubset subset whole flat => (Record f subset -> Record f subset) -> Record f whole -> Record f whole
- type SumlikeSubset (subset :: Map Symbol q) (whole :: Map Symbol q) (subflat :: [q]) (wholeflat :: [q]) = (KeysValuesAll (PresentIn whole) subset, Productlike '[] whole wholeflat, Sumlike '[] whole wholeflat, SListI wholeflat, Productlike '[] subset subflat, Sumlike '[] subset subflat, SListI subflat)
- branchSubset :: forall subset whole subflat wholeflat f. SumlikeSubset subset whole subflat wholeflat => (Variant f whole -> Maybe (Variant f subset), Variant f subset -> Variant f whole)
- injectSubset :: forall subset whole subflat wholeflat f. SumlikeSubset subset whole subflat wholeflat => Variant f subset -> Variant f whole
- matchSubset :: forall subset whole subflat wholeflat f. SumlikeSubset subset whole subflat wholeflat => Variant f whole -> Maybe (Variant f subset)
- eliminateSubset :: forall subset whole subflat wholeflat f r. SumlikeSubset subset whole subflat wholeflat => Record (Case f r) whole -> Variant f subset -> r
- class Productlike (start :: [k]) (t :: Map Symbol k) (result :: [k]) | start t -> result, result t -> start where
- prefixNP :: forall start t result f. Productlike start t result => Record f t -> NP f start -> NP f result
- breakNP :: forall start t result f. Productlike start t result => NP f result -> (Record f t, NP f start)
- toNP :: forall t result f. Productlike '[] t result => Record f t -> NP f result
- fromNP :: forall t result f. Productlike '[] t result => NP f result -> Record f t
- class Sumlike (start :: [k]) (t :: Map Symbol k) (result :: [k]) | start t -> result, result t -> start where
- prefixNS :: forall start t result f. Sumlike start t result => Either (NS f start) (Variant f t) -> NS f result
- breakNS :: forall start t result f. Sumlike start t result => NS f result -> Either (NS f start) (Variant f t)
- toNS :: forall t result f. Sumlike '[] t result => Variant f t -> NS f result
- fromNS :: forall t result f. Sumlike '[] t result => NS f result -> Variant f t
- class ToRecord (r :: Type) where
- type RecordCode r :: Map Symbol Type
- toRecord :: r -> Record I (RecordCode r)
- class ToRecordHelper (start :: Map Symbol Type) (g :: Type -> Type) where
- type RecordCode' start g :: Map Symbol Type
- toRecord' :: Record I start -> g x -> Record I (RecordCode' start g)
- class ToRecord r => FromRecord (r :: Type) where
- fromRecord :: Record I (RecordCode r) -> r
- type IsRecordType (r :: Type) (t :: Map Symbol Type) = (Generic r, ToRecord r, RecordCode r ~ t, FromRecord r)
- class FromRecordHelper (t :: Map Symbol Type) (g :: Type -> Type) where
- fromRecord' :: Record I t -> g x
- type family VariantCode (s :: Type) :: Map Symbol Type where ...
- type family VariantCode' (acc :: Map Symbol Type) (g :: Type -> Type) :: Map Symbol Type where ...
- class FromVariant (s :: Type) where
- fromVariant :: Variant I (VariantCode s) -> s
- type IsVariantType (v :: Type) (t :: Map Symbol Type) = (Generic v, ToVariant v, VariantCode v ~ t, FromVariant v)
- class FromVariantHelper (t :: Map Symbol Type) (g :: Type -> Type) where
- fromVariant' :: Variant I t -> Maybe (g x)
- class ToVariant (s :: Type) where
- toVariant :: s -> Variant I (VariantCode s)
- class ToVariantHelper (t :: Map Symbol Type) (g :: Type -> Type) where
- toVariant' :: g x -> Variant I t
- type family DiscriminateBalL (l :: Map k v) (r :: Map k v) :: Bool where ...
- class BalanceableL (l :: Map Symbol q) (k :: Symbol) (v :: q) (r :: Map Symbol q) where
- class BalanceableHelperL (b :: Bool) (l :: Map Symbol q) (k :: Symbol) (v :: q) (r :: Map Symbol q) where
- type family DiscriminateBalR (l :: Map k v) (r :: Map k v) :: Bool where ...
- class BalanceableR (l :: Map Symbol q) (k :: Symbol) (v :: q) (r :: Map Symbol q) where
- class BalanceableHelperR (b :: Bool) (l :: Map Symbol q) (k :: Symbol) (v :: q) (r :: Map Symbol q) where
- class Fuseable (l :: Map Symbol q) (r :: Map Symbol q) where
- class FuseableHelper1 (fused :: Map Symbol q) (l :: Map Symbol q) (r :: Map Symbol q) where
- class FuseableHelper2 (fused :: Map Symbol q) (l :: Map Symbol q) (r :: Map Symbol q) where
- class Delable (k :: Symbol) (v :: q) (t :: Map Symbol q) where
- class DelableL (k :: Symbol) (v :: q) (l :: Map Symbol q) (kx :: Symbol) (vx :: q) (r :: Map Symbol q) where
- class DelableR (k :: Symbol) (v :: q) (l :: Map Symbol q) (kx :: Symbol) (vx :: q) (r :: Map Symbol q) where
- class DelableHelper (ordering :: Ordering) (k :: Symbol) (v :: q) (l :: Map Symbol q) (kx :: Symbol) (vx :: q) (r :: Map Symbol q) where
- class Deletable (k :: Symbol) (v :: q) (t :: Map Symbol q) where
- delete :: forall k v t f. Deletable k v t => Record f t -> Record f (Delete k v t)
- winnow :: forall k v t f. Deletable k v t => Variant f t -> Either (Variant f (Delete k v t)) (f v)
- winnowI :: forall k v t. Deletable k v t => Variant I t -> Either (Variant I (Delete k v t)) v
Documentation
>>>
:set -XDataKinds -XTypeApplications -XPartialTypeSignatures -XFlexibleContexts -XTypeFamilies -XDeriveGeneric
>>>
:set -Wno-partial-type-signatures
>>>
import Data.RBR
>>>
import Data.SOP
>>>
import GHC.Generics
The color of a node.
type family KeysValuesAllF c t :: Constraint where ... Source #
KeysValuesAllF _ E = () | |
KeysValuesAllF c (N color left k v right) = (c k v, KeysValuesAll c left, KeysValuesAll c right) |
class KeysValuesAllF c t => KeysValuesAll (c :: symbol -> q -> Constraint) (t :: Map symbol q) where Source #
Require a constraint for every key-value pair in a tree. This is a generalization of All
from Data.SOP.
cpara_Map :: proxy c -> r E -> (forall left k v right color. (c k v, KeysValuesAll c left, KeysValuesAll c right) => r left -> r right -> r (N color left k v right)) -> r t Source #
Instances
KeysValuesAll (c :: symbol -> q -> Constraint) ('E :: Map symbol q) Source # | |
Defined in Data.RBR.Internal | |
(c k v, KeysValuesAll c left, KeysValuesAll c right) => KeysValuesAll (c :: symbol -> q -> Constraint) ('N color left k v right :: Map symbol q) Source # | |
Defined in Data.RBR.Internal |
class Maplike (t :: Map Symbol Type) where Source #
This typeclass provides generalizations of Applicative
-like functions
which work over Record
s and Variant
s.
pure_Record :: (forall v. f v) -> Record f t Source #
See cpure_Record
and cpure'_Record
for more useful versions of
this function.
The naming scheme follows that of pure_NP
.
sequence_Record :: Applicative f => Record f t -> f (Record I t) Source #
Pulls out an Applicative
that wraps each field, resulting in an Applicative
containing a pure Record
.
The naming scheme follows that of sequence_NP
.
sequence'_Record :: Applicative f => Record (f :.: g) t -> f (Record g t) Source #
Like sequence_Record
, but only pulls out the outer Applicative
from an Applicative
composition that wraps each field. See
:.:
.
This can be useful for staged computations, where each stage is
represented by an Applicative
layer.
The naming scheme follows that of sequence'_NP
.
liftA_Record :: (forall a. f a -> g a) -> Record f t -> Record g t Source #
Apply a transformation to the type constructor which wraps the fields of a Record
.
The naming scheme follows that of liftA_NP
.
liftA2_Record :: (forall a. f a -> g a -> h a) -> Record f t -> Record g t -> Record h t Source #
The naming scheme follows that of liftA2_NP
.
liftA_Variant :: (forall a. f a -> g a) -> Variant f t -> Variant g t Source #
Apply a transformation to the active branch of a Variant
.
The naming scheme follows that of liftA_NS
.
liftA2_Variant :: (forall a. f a -> g a -> h a) -> Record f t -> Variant g t -> Variant h t Source #
Given a Record
of transformation, apply the one which matches the active branch of Variant
.
The naming scheme follows that of liftA2_NS
.
injections'_Variant :: Record (Case f (Variant f t)) t Source #
Constructs a Record
made of functions which take a value of the
field's type and inject it in the Variant
branch which corresponds
to the field.
Compare to injections
from generics-sop
.
injections_Record :: Record (Case f (Endo (Record f t))) t Source #
Constructs a Record
made of functions which take a value of the
field's type and return a record updater function that sets the field.
collapse'_Record :: Monoid a => Record (K a) t -> a Source #
Collapse a Record
composed of K
monoidal annotations.
>>>
collapse'_Record (unit :: Record (K [Bool]) Empty)
[]
>>>
collapse'_Record (insert @"bar" (K [False]) unit)
[False]
The naming scheme follows that of collapse_NP
.
collapse_Variant :: Variant (K a) t -> a Source #
Instances
Maplike ('E :: Map Symbol Type) Source # | |
Defined in Data.RBR.Internal pure_Record :: (forall v. f v) -> Record f 'E Source # sequence_Record :: Applicative f => Record f 'E -> f (Record I 'E) Source # sequence'_Record :: forall f (g :: Type -> Type). Applicative f => Record (f :.: g) 'E -> f (Record g 'E) Source # liftA_Record :: (forall a. f a -> g a) -> Record f 'E -> Record g 'E Source # liftA2_Record :: (forall a. f a -> g a -> h a) -> Record f 'E -> Record g 'E -> Record h 'E Source # liftA_Variant :: (forall a. f a -> g a) -> Variant f 'E -> Variant g 'E Source # liftA2_Variant :: (forall a. f a -> g a -> h a) -> Record f 'E -> Variant g 'E -> Variant h 'E Source # injections'_Variant :: forall (f :: Type -> Type). Record (Case f (Variant f 'E)) 'E Source # injections_Record :: forall (f :: Type -> Type). Record (Case f (Endo (Record f 'E))) 'E Source # collapse'_Record :: Monoid a => Record (K a) 'E -> a Source # | |
(Maplike left, Maplike right) => Maplike ('N color left k v right) Source # | |
Defined in Data.RBR.Internal pure_Record :: (forall v0. f v0) -> Record f ('N color left k v right) Source # sequence_Record :: Applicative f => Record f ('N color left k v right) -> f (Record I ('N color left k v right)) Source # sequence'_Record :: forall f (g :: Type -> Type). Applicative f => Record (f :.: g) ('N color left k v right) -> f (Record g ('N color left k v right)) Source # liftA_Record :: (forall a. f a -> g a) -> Record f ('N color left k v right) -> Record g ('N color left k v right) Source # liftA2_Record :: (forall a. f a -> g a -> h a) -> Record f ('N color left k v right) -> Record g ('N color left k v right) -> Record h ('N color left k v right) Source # liftA_Variant :: (forall a. f a -> g a) -> Variant f ('N color left k v right) -> Variant g ('N color left k v right) Source # liftA2_Variant :: (forall a. f a -> g a -> h a) -> Record f ('N color left k v right) -> Variant g ('N color left k v right) -> Variant h ('N color left k v right) Source # injections'_Variant :: forall (f :: Type -> Type). Record (Case f (Variant f ('N color left k v right))) ('N color left k v right) Source # injections_Record :: forall (f :: Type -> Type). Record (Case f (Endo (Record f ('N color left k v right)))) ('N color left k v right) Source # collapse'_Record :: Monoid a => Record (K a) ('N color left k v right) -> a Source # collapse_Variant :: Variant (K a) ('N color left k v right) -> a Source # |
injections_Variant :: Maplike t => Record (VariantInjection f t) t Source #
Deprecated: Use injections'_Variant instead
newtype VariantInjection (f :: q -> Type) (t :: Map Symbol q) (v :: q) Source #
Deprecated: Use Case instead
VariantInjection | Deprecated: Use Case instead |
|
cpure_Record :: forall c t f. KeysValuesAll c t => Proxy c -> (forall k v. c k v => f v) -> Record f t Source #
cpure'_Record :: forall c t f. KeysValuesAll (KeyValueConstraints KnownSymbol c) t => Proxy c -> (forall v. c v => String -> f v) -> Record f t Source #
cliftA_Record :: forall c t f g. KeysValuesAll c t => Proxy c -> (forall k v. c k v => f v -> g v) -> Record f t -> Record g t Source #
cliftA2_Record :: forall c t f g h. KeysValuesAll c t => Proxy c -> (forall k v. c k v => f v -> g v -> h v) -> Record f t -> Record g t -> Record h t Source #
The naming scheme follows that of cliftA2_NP
.
demoteKeys :: forall t. KeysValuesAll KnownKey t => Record (K String) t Source #
Create a Record
containing the names of each field.
The names are represented by a constant functor K
carrying an annotation
of type String
. This means that there aren't actually any values of the
type that corresponds to each field, only the String
annotations.
>>>
putStrLn $ prettyShow_Record show $ demoteKeys @(FromList [ '("foo",Char), '("bar",Bool) ])
{bar = K "bar", foo = K "foo"}
For computations involving field names, sometimes cpure'_Record
is a better option.
class KnownSymbol k => KnownKey (k :: Symbol) (v :: q) Source #
Two-place constraint saying that a Symbol
key can be demoted to String
. Nothing is required from the corresponding value.
Defined using the "class synonym" trick.
Instances
KnownSymbol k => KnownKey k (v :: q) Source # | |
Defined in Data.RBR.Internal |
demoteEntries :: forall t. KeysValuesAll KnownKeyTypeableValue t => Record (K (String, TypeRep)) t Source #
Create a record containing the names of each field along with a term-level representation of each type.
>>>
putStrLn $ prettyShow_Record show $ demoteEntries @(FromList [ '("foo",Char), '("bar",Bool) ])
{bar = K ("bar",Bool), foo = K ("foo",Char)}
class (KnownSymbol k, Typeable v) => KnownKeyTypeableValue (k :: Symbol) (v :: q) Source #
Two-place constraint saying that a Symbol
key can be demoted to String
, and that the corresponding value Type
has a term-level representation.
Defined using the "class synonym" trick.
Instances
(KnownSymbol k, Typeable v) => KnownKeyTypeableValue k (v :: q) Source # | |
Defined in Data.RBR.Internal |
class (kc k, vc v) => KeyValueConstraints (kc :: Symbol -> Constraint) (vc :: q -> Constraint) (k :: Symbol) (v :: q) Source #
Lifts two one-place constraints (one for keys, one for values) to a two-place constraint. Useful with function like cpure_Record
.
Defined using the "class synonym" trick.
Instances
(kc k, vc v) => KeyValueConstraints kc (vc :: q -> Constraint) k (v :: q) Source # | |
Defined in Data.RBR.Internal |
class vc v => ValueConstraint (vc :: q -> Constraint) (k :: Symbol) (v :: q) Source #
Lifts a one-place constraint for values to a two-place constraint. Useful with function like cpure_Record
.
Defined using the "class synonym" trick.
Instances
vc v => ValueConstraint (vc :: q -> Constraint) k (v :: q) Source # | |
Defined in Data.RBR.Internal |
data Record (f :: q -> Type) (t :: Map Symbol q) where Source #
An extensible product-like type with named fields.
The values in the Record
come wrapped in a type constructor f
, which
for pure records will be the identity functor I
.
Empty :: Record f E | |
Node :: Record f left -> f v -> Record f right -> Record f (N color left k v right) |
Instances
(Productlike ('[] :: [q]) t result, Show (NP f result)) => Show (Record f t) Source # | |
FromRecord (Record I t) Source # | |
Defined in Data.RBR.Internal fromRecord :: Record I (RecordCode (Record I t)) -> Record I t Source # | |
ToRecord (Record I t) Source # | |
type RecordCode (Record I t) Source # | |
Defined in Data.RBR.Internal |
collapse_Record :: forall t result a. Productlike '[] t result => Record (K a) t -> [a] Source #
Deprecated: Use collapse'_Record
prettyShow_Record :: forall t f. (Maplike t, KeysValuesAll (KeyValueConstraints KnownSymbol Show) t) => (forall x. Show x => f x -> String) -> Record f t -> String Source #
prettyShow_RecordI :: forall t. (Maplike t, KeysValuesAll (KeyValueConstraints KnownSymbol Show) t) => Record I t -> String Source #
Like prettyShow_Record
but specialized to pure records.
prettyShowRecord :: forall t flat f. (KeysValuesAll KnownKey t, Productlike '[] t flat, All Show flat, SListI flat) => (forall x. Show x => f x -> String) -> Record f t -> String Source #
Deprecated: Use prettyShow_Record
prettyShowRecordI :: forall t flat. (KeysValuesAll KnownKey t, Productlike '[] t flat, All Show flat, SListI flat) => Record I t -> String Source #
Deprecated: Use prettyShow_RecordI
unit :: Record f Empty Source #
A Record without components is a boring, uninformative type whose single value can be conjured out of thin air.
data Variant (f :: q -> Type) (t :: Map Symbol q) where Source #
An extensible sum-like type with named branches.
The values in the Variant
come wrapped in a type constructor f
, which
por pure variants will be the identity functor I
.
impossible :: Variant f Empty -> b Source #
A Variant without branches doesn't have any values. From an impossible thing, anything can come out.
prettyShow_Variant :: forall t flat f. (Maplike t, KeysValuesAll (KeyValueConstraints KnownSymbol Show) t) => (forall x. Show x => f x -> String) -> Variant f t -> String Source #
prettyShow_VariantI :: forall t flat. (Maplike t, KeysValuesAll (KeyValueConstraints KnownSymbol Show) t) => Variant I t -> String Source #
Like prettyShow_Variant
but specialized to pure variants.
prettyShowVariant :: forall t flat f. (KeysValuesAll KnownKey t, Productlike '[] t flat, Sumlike '[] t flat, All Show flat, SListI flat) => (forall x. Show x => f x -> String) -> Variant f t -> String Source #
Deprecated: Use prettyShow_Variant
prettyShowVariantI :: forall t flat. (KeysValuesAll KnownKey t, Productlike '[] t flat, Sumlike '[] t flat, All Show flat, SListI flat) => Variant I t -> String Source #
Deprecated: Use prettyShow_VariantI
type family InsertAll (es :: [(Symbol, q)]) (t :: Map Symbol q) :: Map Symbol q where ... Source #
Insert a list of type level key / value pairs into a type-level map.
type FromList (es :: [(Symbol, q)]) = InsertAll es Empty Source #
Build a type-level map out of a list of type level key / value pairs.
insert :: forall k v t f. Insertable k v t => f v -> Record f t -> Record f (Insert k v t) Source #
Adds a new field to a Record
.
>>>
project @"foo" (insert @"foo" (I 'a') unit)
I 'a'
>>>
project @"foo" (insert @"foo" @Char Nothing unit)
Nothing
widen :: forall k v t f. Insertable k v t => Variant f t -> Variant f (Insert k v t) Source #
Lets you use a Variant
in a bigger context
than the one in which is was defined.
addField :: forall k v t f. Insertable k v t => f v -> Record f t -> Record f (Insert k v t) Source #
Alias for insert
.
class Insertable (k :: Symbol) (v :: q) (t :: Map Symbol q) where Source #
Class that determines if the pair of a Symbol
key and a type can
be inserted into a type-level map.
The associated type family Insert
produces the resulting map.
At the term level, this manifests in insert
, which adds a new field to a
record, and in widen
, which lets you use a Variant
in a bigger context
than the one in which is was defined. insert
tends to be more useful in
practice.
If the map already has the key but with a different type, the insertion fails to compile.
Instances
(InsertableHelper1 k v t, Insert1 k v t ~ inserted, CanMakeBlack inserted) => Insertable k (v :: q) (t :: Map Symbol q) Source # | |
class CanMakeBlack (t :: Map Symbol q) where Source #
makeBlackR :: Record f t -> Record f (MakeBlack t) Source #
makeBlackV :: Variant f t -> Variant f (MakeBlack t) Source #
Instances
CanMakeBlack ('E :: Map Symbol q) Source # | |
CanMakeBlack ('N color left k v right :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal |
class InsertableHelper1 (k :: Symbol) (v :: q) (t :: Map Symbol q) where Source #
Instances
InsertableHelper1 k (v :: q) ('E :: Map Symbol q) Source # | |
(CmpSymbol k k' ~ ordering, InsertableHelper2 ordering k v color left k' v' right) => InsertableHelper1 k (v :: q) ('N color left k' v' right :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal |
class InsertableHelper2 (ordering :: Ordering) (k :: Symbol) (v :: q) (color :: Color) (left :: Map Symbol q) (k' :: Symbol) (v' :: q) (right :: Map Symbol q) where Source #
insert2 :: f v -> Record f (N color left k' v' right) -> Record f (Insert2 ordering k v color left k' v' right) Source #
widen2 :: Variant f (N color left k' v' right) -> Variant f (Insert2 ordering k v color left k' v' right) Source #
Instances
InsertableHelper2 'EQ k (v :: q) color (left :: Map Symbol q) k (v :: q) (right :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal | |
(InsertableHelper1 k v right, Insert1 k v right ~ inserted, Balanceable left k' v' inserted) => InsertableHelper2 'GT k (v :: q) 'B (left :: Map Symbol q) k' (v' :: q) (right :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal | |
(InsertableHelper1 k v right, Insert1 k v right ~ inserted, Balanceable left k' v' inserted) => InsertableHelper2 'GT k (v :: q) 'R (left :: Map Symbol q) k' (v' :: q) (right :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal | |
(InsertableHelper1 k v left, Insert1 k v left ~ inserted, Balanceable inserted k' v' right) => InsertableHelper2 'LT k (v :: q) 'B (left :: Map Symbol q) k' (v' :: q) (right :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal | |
(InsertableHelper1 k v left, Insert1 k v left ~ inserted, Balanceable inserted k' v' right) => InsertableHelper2 'LT k (v :: q) 'R (left :: Map Symbol q) k' (v' :: q) (right :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal |
data BalanceAction Source #
Instances
Show BalanceAction Source # | |
Defined in Data.RBR.Internal showsPrec :: Int -> BalanceAction -> ShowS # show :: BalanceAction -> String # showList :: [BalanceAction] -> ShowS # |
type family ShouldBalance (left :: Map k' v') (right :: Map k' v') :: BalanceAction where ... Source #
ShouldBalance (N R _ _ _ _) (N R _ _ _ _) = BalanceSpecial | |
ShouldBalance (N R (N R _ _ _ _) _ _ _) _ = BalanceLL | |
ShouldBalance (N R _ _ _ (N R _ _ _ _)) _ = BalanceLR | |
ShouldBalance _ (N R (N R _ _ _ _) _ _ _) = BalanceRL | |
ShouldBalance _ (N R _ _ _ (N R _ _ _ _)) = BalanceRR | |
ShouldBalance _ _ = DoNotBalance |
class Balanceable (left :: Map Symbol q) (k :: Symbol) (v :: q) (right :: Map Symbol q) where Source #
balanceR :: Record f (N color left k v right) -> Record f (Balance left k v right) Source #
balanceV :: Variant f (N color left k v right) -> Variant f (Balance left k v right) Source #
Instances
(ShouldBalance left right ~ action, BalanceableHelper action left k v right) => Balanceable (left :: Map Symbol q) k (v :: q) (right :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal |
class BalanceableHelper (action :: BalanceAction) (left :: Map Symbol q) (k :: Symbol) (v :: q) (right :: Map Symbol q) where Source #
balanceR' :: Record f (N color left k v right) -> Record f (Balance' action left k v right) Source #
balanceV' :: Variant f (N color left k v right) -> Variant f (Balance' action left k v right) Source #
Instances
BalanceableHelper 'DoNotBalance (a :: Map Symbol q) k (v :: q) (b :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal | |
BalanceableHelper 'BalanceRL (a :: Map Symbol q) k1 (v1 :: q) ('N 'R ('N 'R b k2 v2 c) k3 v3 d :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal balanceR' :: forall (f :: q0 -> Type) (color :: Color). Record f ('N color a k1 v1 ('N 'R ('N 'R b k2 v2 c) k3 v3 d)) -> Record f (Balance' 'BalanceRL a k1 v1 ('N 'R ('N 'R b k2 v2 c) k3 v3 d)) Source # balanceV' :: forall (f :: q0 -> Type) (color :: Color). Variant f ('N color a k1 v1 ('N 'R ('N 'R b k2 v2 c) k3 v3 d)) -> Variant f (Balance' 'BalanceRL a k1 v1 ('N 'R ('N 'R b k2 v2 c) k3 v3 d)) Source # | |
BalanceableHelper 'BalanceRR (a :: Map Symbol q) k1 (v1 :: q) ('N 'R b k2 v2 ('N 'R c k3 v3 d) :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal balanceR' :: forall (f :: q0 -> Type) (color :: Color). Record f ('N color a k1 v1 ('N 'R b k2 v2 ('N 'R c k3 v3 d))) -> Record f (Balance' 'BalanceRR a k1 v1 ('N 'R b k2 v2 ('N 'R c k3 v3 d))) Source # balanceV' :: forall (f :: q0 -> Type) (color :: Color). Variant f ('N color a k1 v1 ('N 'R b k2 v2 ('N 'R c k3 v3 d))) -> Variant f (Balance' 'BalanceRR a k1 v1 ('N 'R b k2 v2 ('N 'R c k3 v3 d))) Source # | |
BalanceableHelper 'BalanceLL ('N 'R ('N 'R a k1 v1 b) k2 v2 c :: Map Symbol q) k3 (v3 :: q) (d :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal balanceR' :: forall (f :: q0 -> Type) (color :: Color). Record f ('N color ('N 'R ('N 'R a k1 v1 b) k2 v2 c) k3 v3 d) -> Record f (Balance' 'BalanceLL ('N 'R ('N 'R a k1 v1 b) k2 v2 c) k3 v3 d) Source # balanceV' :: forall (f :: q0 -> Type) (color :: Color). Variant f ('N color ('N 'R ('N 'R a k1 v1 b) k2 v2 c) k3 v3 d) -> Variant f (Balance' 'BalanceLL ('N 'R ('N 'R a k1 v1 b) k2 v2 c) k3 v3 d) Source # | |
BalanceableHelper 'BalanceLR ('N 'R a k1 v1 ('N 'R b k2 v2 c) :: Map Symbol q) k3 (v3 :: q) (d :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal balanceR' :: forall (f :: q0 -> Type) (color :: Color). Record f ('N color ('N 'R a k1 v1 ('N 'R b k2 v2 c)) k3 v3 d) -> Record f (Balance' 'BalanceLR ('N 'R a k1 v1 ('N 'R b k2 v2 c)) k3 v3 d) Source # balanceV' :: forall (f :: q0 -> Type) (color :: Color). Variant f ('N color ('N 'R a k1 v1 ('N 'R b k2 v2 c)) k3 v3 d) -> Variant f (Balance' 'BalanceLR ('N 'R a k1 v1 ('N 'R b k2 v2 c)) k3 v3 d) Source # | |
BalanceableHelper 'BalanceSpecial ('N 'R left1 k1 v1 right1 :: Map Symbol q) kx (vx :: q) ('N 'R left2 k2 v2 right2 :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal type Balance' 'BalanceSpecial ('N 'R left1 k1 v1 right1) kx vx ('N 'R left2 k2 v2 right2) :: Map Symbol q Source # balanceR' :: forall (f :: q0 -> Type) (color :: Color). Record f ('N color ('N 'R left1 k1 v1 right1) kx vx ('N 'R left2 k2 v2 right2)) -> Record f (Balance' 'BalanceSpecial ('N 'R left1 k1 v1 right1) kx vx ('N 'R left2 k2 v2 right2)) Source # balanceV' :: forall (f :: q0 -> Type) (color :: Color). Variant f ('N color ('N 'R left1 k1 v1 right1) kx vx ('N 'R left2 k2 v2 right2)) -> Variant f (Balance' 'BalanceSpecial ('N 'R left1 k1 v1 right1) kx vx ('N 'R left2 k2 v2 right2)) Source # |
type family Field (f :: q -> Type) (t :: Map Symbol q) (v :: q) where ... Source #
Auxiliary type family to avoid repetition and help improve compilation times.
type family Branch (f :: q -> Type) (t :: Map Symbol q) (v :: q) where ... Source #
Auxiliary type family to avoid repetition and help improve compilation times.
class Key (k :: Symbol) (t :: Map Symbol q) where Source #
Class that determines if a given Symbol
key is present in a type-level
map.
The Value
type family gives the Type
corresponding to the key.
field :: forall k t f. Key k t => Field f t (Value k t) Source #
Takes a field name (given through TypeApplications
) and a
Record
, and returns a pair of a setter for the field and the original
value of the field.
branch :: forall k t f. Key k t => Branch f t (Value k t) Source #
Takes a branch name (given through TypeApplications
) and
returns a pair of a match function and a constructor.
class KeyHelper (ordering :: Ordering) (k :: Symbol) (left :: Map Symbol q) (v :: q) (right :: Map Symbol q) where Source #
field' :: Field f (N colorx left kx v right) (Value' ordering k left v right) Source #
branch' :: Branch f (N colorx left kx v right) (Value' ordering k left v right) Source #
Instances
KeyHelper 'EQ k (left :: Map Symbol q) (v :: q) (right :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal | |
(CmpSymbol k2 k ~ ordering, KeyHelper ordering k left2 v2 right2) => KeyHelper 'LT k (left :: Map Symbol q) (v :: q) ('N color2 left2 k2 v2 right2 :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal field' :: forall (f :: q0 -> Type) (colorx :: Color) (kx :: Symbol). Field f ('N colorx left kx v ('N color2 left2 k2 v2 right2)) (Value' 'LT k left v ('N color2 left2 k2 v2 right2)) Source # branch' :: forall (f :: q0 -> Type) (colorx :: Color) (kx :: Symbol). Branch f ('N colorx left kx v ('N color2 left2 k2 v2 right2)) (Value' 'LT k left v ('N color2 left2 k2 v2 right2)) Source # | |
(CmpSymbol k2 k ~ ordering, KeyHelper ordering k left2 v2 right2) => KeyHelper 'GT k ('N color2 left2 k2 v2 right2 :: Map Symbol q) (v' :: q) (right :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal field' :: forall (f :: q0 -> Type) (colorx :: Color) (kx :: Symbol). Field f ('N colorx ('N color2 left2 k2 v2 right2) kx v' right) (Value' 'GT k ('N color2 left2 k2 v2 right2) v' right) Source # branch' :: forall (f :: q0 -> Type) (colorx :: Color) (kx :: Symbol). Branch f ('N colorx ('N color2 left2 k2 v2 right2) kx v' right) (Value' 'GT k ('N color2 left2 k2 v2 right2) v' right) Source # |
project :: forall k t f. Key k t => Record f t -> f (Value k t) Source #
Get the value of a field for a Record
.
setField :: forall k t f. Key k t => f (Value k t) -> Record f t -> Record f t Source #
Set the value of a field for a Record
.
modifyField :: forall k t f. Key k t => (f (Value k t) -> f (Value k t)) -> Record f t -> Record f t Source #
Modify the value of a field for a Record
.
inject :: forall k t f. Key k t => f (Value k t) -> Variant f t Source #
Put a value into the branch of a Variant
.
>>>
match @"foo" (inject @"foo" (I 'a') :: Variant I (Insert "foo" Char Empty))
Just (I 'a')
match :: forall k t f. Key k t => Variant f t -> Maybe (f (Value k t)) Source #
Check if a Variant
value is the given branch.
modifyFieldI :: forall k t. Key k t => (Value k t -> Value k t) -> Record I t -> Record I t Source #
Like modifyField
but specialized to pure Record
s.
matchI :: forall k t. Key k t => Variant I t -> Maybe (Value k t) Source #
Like match
but specialized to pure Variants
s.
eliminate :: (Productlike '[] t result, Sumlike '[] t result, SListI result) => Record (Case f r) t -> Variant f t -> r Source #
Deprecated: Use eliminate_Variant instead.
Represents a handler for a branch of a Variant
.
addCase :: forall k v t f a. Insertable k v t => (f v -> a) -> Record (Case f a) t -> Record (Case f a) (Insert k v t) Source #
addCaseI :: forall k v t a. Insertable k v t => (v -> a) -> Record (Case I a) t -> Record (Case I a) (Insert k v t) Source #
A pure version of addCase
.
newtype SetField f a b Source #
SetField | |
|
class (Key k t, Value k t ~ v) => PresentIn (t :: Map Symbol q) (k :: Symbol) (v :: q) Source #
type ProductlikeSubset (subset :: Map Symbol q) (whole :: Map Symbol q) (flat :: [q]) = (KeysValuesAll (PresentIn whole) subset, Productlike '[] subset flat, SListI flat) Source #
Deprecated: This constraint is obsolete
fieldSubset :: forall subset whole flat f. ProductlikeSubset subset whole flat => Record f whole -> (Record f subset -> Record f whole, Record f subset) Source #
Deprecated: Use Data.RBR.Subset.fieldSubset
projectSubset :: forall subset whole flat f. ProductlikeSubset subset whole flat => Record f whole -> Record f subset Source #
Deprecated: Use Data.RBR.Subset.projectSubset
getFieldSubset :: forall subset whole flat f. ProductlikeSubset subset whole flat => Record f whole -> Record f subset Source #
Deprecated: Use Data.RBR.Subset.getFieldSubset
setFieldSubset :: forall subset whole flat f. ProductlikeSubset subset whole flat => Record f subset -> Record f whole -> Record f whole Source #
Deprecated: Use Data.RBR.Subset.setFieldSubset
modifyFieldSubset :: forall subset whole flat f. ProductlikeSubset subset whole flat => (Record f subset -> Record f subset) -> Record f whole -> Record f whole Source #
Deprecated: Use Data.RBR.Subset.modifyFieldSubset
type SumlikeSubset (subset :: Map Symbol q) (whole :: Map Symbol q) (subflat :: [q]) (wholeflat :: [q]) = (KeysValuesAll (PresentIn whole) subset, Productlike '[] whole wholeflat, Sumlike '[] whole wholeflat, SListI wholeflat, Productlike '[] subset subflat, Sumlike '[] subset subflat, SListI subflat) Source #
Deprecated: This constraint is obsolete
branchSubset :: forall subset whole subflat wholeflat f. SumlikeSubset subset whole subflat wholeflat => (Variant f whole -> Maybe (Variant f subset), Variant f subset -> Variant f whole) Source #
Deprecated: Use Data.RBR.Subset.branchSubset
injectSubset :: forall subset whole subflat wholeflat f. SumlikeSubset subset whole subflat wholeflat => Variant f subset -> Variant f whole Source #
Deprecated: Use Data.RBR.Subset.injectSubset
matchSubset :: forall subset whole subflat wholeflat f. SumlikeSubset subset whole subflat wholeflat => Variant f whole -> Maybe (Variant f subset) Source #
Deprecated: Use Data.RBR.Subset.matchSubset
eliminateSubset :: forall subset whole subflat wholeflat f r. SumlikeSubset subset whole subflat wholeflat => Record (Case f r) whole -> Variant f subset -> r Source #
Deprecated: Use Data.RBR.Subset.eliminateSubset
class Productlike (start :: [k]) (t :: Map Symbol k) (result :: [k]) | start t -> result, result t -> start where Source #
Class from converting Record
s to and from the n-ary product type NP
from Data.SOP.
prefixNP
flattens a Record
and adds it to the initial part of the product.
breakNP
reconstructs a Record
from the initial part of the product and returns the unconsumed part.
_prefixNP :: Record f t -> NP f start -> NP f result Source #
_breakNP :: NP f result -> (Record f t, NP f start) Source #
Instances
Productlike (start :: [k]) ('E :: Map Symbol k) (start :: [k]) Source # | |
(Productlike start right middle, Productlike (v ': middle) left result) => Productlike (start :: [q]) ('N color left k v right :: Map Symbol q) (result :: [q]) Source # | |
prefixNP :: forall start t result f. Productlike start t result => Record f t -> NP f start -> NP f result Source #
Flattens a Record
and adds it to the initial part of the product.
breakNP :: forall start t result f. Productlike start t result => NP f result -> (Record f t, NP f start) Source #
Reconstructs a Record
from the initial part of the product and returns the unconsumed part.
toNP :: forall t result f. Productlike '[] t result => Record f t -> NP f result Source #
Convert a Record
into a n-ary product. The order of the elements in the
product is not the order of insertion in the record.
>>>
toNP (insertI @"foo" 'a' (insertI @"bar" True unit))
I True :* I 'a' :* Nil
class Sumlike (start :: [k]) (t :: Map Symbol k) (result :: [k]) | start t -> result, result t -> start where Source #
Class from converting Variant
s to and from the n-ary sum type NS
from Data.SOP.
prefixNS
flattens a Variant
and adds it to the initial part of the sum.
breakNS
reconstructs a Variant
from the initial part of the sum and returns the unconsumed part.
_prefixNS :: Either (NS f start) (Variant f t) -> NS f result Source #
_breakNS :: NS f result -> Either (NS f start) (Variant f t) Source #
Instances
Sumlike (v ': start) ('N colorL leftL kL vL rightL) result => Sumlike (start :: [q]) ('N color ('N colorL leftL kL vL rightL) k v ('E :: Map Symbol q) :: Map Symbol q) (result :: [q]) Source # | |
Defined in Data.RBR.Internal | |
(Sumlike start ('N colorR leftR kR vR rightR) middle, Sumlike (v ': middle) ('N colorL leftL kL vL rightL) result) => Sumlike (start :: [q]) ('N color ('N colorL leftL kL vL rightL) k v ('N colorR leftR kR vR rightR) :: Map Symbol q) (result :: [q]) Source # | |
Defined in Data.RBR.Internal _prefixNS :: forall (f :: k0 -> Type). Either (NS f start) (Variant f ('N color ('N colorL leftL kL vL rightL) k v ('N colorR leftR kR vR rightR))) -> NS f result Source # _breakNS :: forall (f :: k0 -> Type). NS f result -> Either (NS f start) (Variant f ('N color ('N colorL leftL kL vL rightL) k v ('N colorR leftR kR vR rightR))) Source # | |
Sumlike (start :: [a]) ('N color ('E :: Map Symbol a) k v ('E :: Map Symbol a) :: Map Symbol a) (v ': start :: [a]) Source # | |
Sumlike start ('N colorR leftR kR vR rightR) middle => Sumlike (start :: [a]) ('N color ('E :: Map Symbol a) k v ('N colorR leftR kR vR rightR) :: Map Symbol a) (v ': middle :: [a]) Source # | |
Defined in Data.RBR.Internal |
prefixNS :: forall start t result f. Sumlike start t result => Either (NS f start) (Variant f t) -> NS f result Source #
Flattens a Variant
and adds it to the initial part of the sum.
breakNS :: forall start t result f. Sumlike start t result => NS f result -> Either (NS f start) (Variant f t) Source #
Reconstructs a Variant
from the initial part of the sum and returns the unconsumed part.
toNS :: forall t result f. Sumlike '[] t result => Variant f t -> NS f result Source #
Convert a Variant
into a n-ary sum.
>>>
toNS (injectI @"foo" 'a' :: Variant I (Insert "foo" Char (Insert "bar" Bool Empty)))
S (Z (I 'a'))
fromNS :: forall t result f. Sumlike '[] t result => NS f result -> Variant f t Source #
Convert a n-ary sum into a compatible Variant
.
>>>
:{
prettyShow_VariantI $ fromNS @(FromList [ '("foo",_), '("bar",_) ]) $ toNS $ (injectI @"foo" 'a' :: Variant I (FromList [ '("foo",Char), '("bar",Bool) ])) :} "foo ('a')"
class ToRecord (r :: Type) where Source #
Nothing
type RecordCode r :: Map Symbol Type Source #
type RecordCode r = RecordCode' E (Rep r)
toRecord :: r -> Record I (RecordCode r) Source #
default toRecord :: (Generic r, ToRecordHelper E (Rep r), RecordCode r ~ RecordCode' E (Rep r)) => r -> Record I (RecordCode r) Source #
Instances
(Generic r, ToRecordHelper ('E :: Map Symbol Type) (Rep r)) => ToRecord (Generically r) Source # | |
Defined in Data.RBR.Internal type RecordCode (Generically r) :: Map Symbol Type Source # toRecord :: Generically r -> Record I (RecordCode (Generically r)) Source # | |
ToRecord (Record I t) Source # | |
class ToRecordHelper (start :: Map Symbol Type) (g :: Type -> Type) where Source #
Instances
(ToRecordHelper start t2, RecordCode' start t2 ~ middle, ToRecordHelper middle t1) => ToRecordHelper start (t1 :*: t2) Source # | |
Insertable k v start => ToRecordHelper start (S1 ('MetaSel ('Just k) unpackedness strictness laziness) (Rec0 v)) Source # | |
ToRecordHelper ('E :: Map Symbol Type) fields => ToRecordHelper ('E :: Map Symbol Type) (D1 meta (C1 metacons fields)) Source # | |
class ToRecord r => FromRecord (r :: Type) where Source #
Nothing
fromRecord :: Record I (RecordCode r) -> r Source #
default fromRecord :: (Generic r, FromRecordHelper (RecordCode r) (Rep r)) => Record I (RecordCode r) -> r Source #
Instances
FromRecord (Record I t) Source # | |
Defined in Data.RBR.Internal fromRecord :: Record I (RecordCode (Record I t)) -> Record I t Source # |
type IsRecordType (r :: Type) (t :: Map Symbol Type) = (Generic r, ToRecord r, RecordCode r ~ t, FromRecord r) Source #
The naming scheme follows that of IsProductType
.
class FromRecordHelper (t :: Map Symbol Type) (g :: Type -> Type) where Source #
fromRecord' :: Record I t -> g x Source #
Instances
(FromRecordHelper t t1, FromRecordHelper t t2) => FromRecordHelper t (t1 :*: t2) Source # | |
Defined in Data.RBR.Internal | |
FromRecordHelper t fields => FromRecordHelper t (D1 meta (C1 metacons fields)) Source # | |
Defined in Data.RBR.Internal | |
(Key k t, Value k t ~ v) => FromRecordHelper t (S1 ('MetaSel ('Just k) unpackedness strictness laziness) (Rec0 v)) Source # | |
Defined in Data.RBR.Internal |
type family VariantCode (s :: Type) :: Map Symbol Type where ... Source #
VariantCode s = VariantCode' E (Rep s) |
type family VariantCode' (acc :: Map Symbol Type) (g :: Type -> Type) :: Map Symbol Type where ... Source #
VariantCode' acc (D1 meta fields) = VariantCode' acc fields | |
VariantCode' acc (t1 :+: t2) = VariantCode' (VariantCode' acc t2) t1 | |
VariantCode' acc (C1 (MetaCons k _ _) (S1 ('MetaSel Nothing unpackedness strictness laziness) (Rec0 v))) = Insert k v acc | |
VariantCode' acc (C1 (MetaCons k _ _) U1) = Insert k () acc |
class FromVariant (s :: Type) where Source #
Nothing
fromVariant :: Variant I (VariantCode s) -> s Source #
default fromVariant :: (Generic s, FromVariantHelper (VariantCode s) (Rep s)) => Variant I (VariantCode s) -> s Source #
type IsVariantType (v :: Type) (t :: Map Symbol Type) = (Generic v, ToVariant v, VariantCode v ~ t, FromVariant v) Source #
The naming scheme follows that of IsProductType
.
class FromVariantHelper (t :: Map Symbol Type) (g :: Type -> Type) where Source #
Instances
(FromVariantHelper t t1, FromVariantHelper t t2) => FromVariantHelper t (t1 :+: t2) Source # | |
Defined in Data.RBR.Internal | |
(Key k t, Value k t ~ v) => FromVariantHelper t (C1 ('MetaCons k x y) (S1 ('MetaSel ('Nothing :: Maybe Symbol) unpackedness strictness laziness) (Rec0 v))) Source # | |
(Key k t, Value k t ~ ()) => FromVariantHelper t (C1 ('MetaCons k x y) (U1 :: Type -> Type)) Source # | |
Defined in Data.RBR.Internal | |
FromVariantHelper t fields => FromVariantHelper t (D1 meta fields) Source # | |
Defined in Data.RBR.Internal |
class ToVariant (s :: Type) where Source #
Nothing
toVariant :: s -> Variant I (VariantCode s) Source #
default toVariant :: (Generic s, ToVariantHelper (VariantCode s) (Rep s)) => s -> Variant I (VariantCode s) Source #
class ToVariantHelper (t :: Map Symbol Type) (g :: Type -> Type) where Source #
toVariant' :: g x -> Variant I t Source #
Instances
(ToVariantHelper t t1, ToVariantHelper t t2) => ToVariantHelper t (t1 :+: t2) Source # | |
Defined in Data.RBR.Internal | |
(Key k t, Value k t ~ v) => ToVariantHelper t (C1 ('MetaCons k x y) (S1 ('MetaSel ('Nothing :: Maybe Symbol) unpackedness strictness laziness) (Rec0 v))) Source # | |
(Key k t, Value k t ~ ()) => ToVariantHelper t (C1 ('MetaCons k x y) (U1 :: Type -> Type)) Source # | |
Defined in Data.RBR.Internal | |
ToVariantHelper t fields => ToVariantHelper t (D1 meta fields) Source # | |
Defined in Data.RBR.Internal |
type family DiscriminateBalL (l :: Map k v) (r :: Map k v) :: Bool where ... Source #
DiscriminateBalL (N R _ _ _ _) _ = False | |
DiscriminateBalL _ _ = True |
class BalanceableL (l :: Map Symbol q) (k :: Symbol) (v :: q) (r :: Map Symbol q) where Source #
balLR :: Record f (N color l k v r) -> Record f (BalL l k v r) Source #
balLV :: Variant f (N color l k v r) -> Variant f (BalL l k v r) Source #
Instances
(DiscriminateBalL l r ~ b, BalanceableHelperL b l k v r) => BalanceableL (l :: Map Symbol q) k (v :: q) (r :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal |
class BalanceableHelperL (b :: Bool) (l :: Map Symbol q) (k :: Symbol) (v :: q) (r :: Map Symbol q) where Source #
balLR' :: Record f (N color l k v r) -> Record f (BalL' b l k v r) Source #
balLV' :: Variant f (N color l k v r) -> Variant f (BalL' b l k v r) Source #
Instances
('N 'R t2 z zv t3 ~ g, BalanceableHelper (ShouldBalance t1 g) t1 y yv g) => BalanceableHelperL 'True (t1 :: Map Symbol q) y (yv :: q) ('N 'B t2 z zv t3 :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal balLR' :: forall (f :: q0 -> Type) (color :: Color). Record f ('N color t1 y yv ('N 'B t2 z zv t3)) -> Record f (BalL' 'True t1 y yv ('N 'B t2 z zv t3)) Source # balLV' :: forall (f :: q0 -> Type) (color :: Color). Variant f ('N color t1 y yv ('N 'B t2 z zv t3)) -> Variant f (BalL' 'True t1 y yv ('N 'B t2 z zv t3)) Source # | |
('N 'R l k kv r ~ g, BalanceableHelper (ShouldBalance t3 g) t3 z zv g) => BalanceableHelperL 'True (t1 :: Map Symbol q) y (yv :: q) ('N 'R ('N 'B t2 u uv t3) z zv ('N 'B l k kv r) :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal balLR' :: forall (f :: q0 -> Type) (color :: Color). Record f ('N color t1 y yv ('N 'R ('N 'B t2 u uv t3) z zv ('N 'B l k kv r))) -> Record f (BalL' 'True t1 y yv ('N 'R ('N 'B t2 u uv t3) z zv ('N 'B l k kv r))) Source # balLV' :: forall (f :: q0 -> Type) (color :: Color). Variant f ('N color t1 y yv ('N 'R ('N 'B t2 u uv t3) z zv ('N 'B l k kv r))) -> Variant f (BalL' 'True t1 y yv ('N 'R ('N 'B t2 u uv t3) z zv ('N 'B l k kv r))) Source # | |
BalanceableHelperL 'False ('N 'R left1 k1 v1 right1 :: Map Symbol q) k2 (v2 :: q) (right2 :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal balLR' :: forall (f :: q0 -> Type) (color :: Color). Record f ('N color ('N 'R left1 k1 v1 right1) k2 v2 right2) -> Record f (BalL' 'False ('N 'R left1 k1 v1 right1) k2 v2 right2) Source # balLV' :: forall (f :: q0 -> Type) (color :: Color). Variant f ('N color ('N 'R left1 k1 v1 right1) k2 v2 right2) -> Variant f (BalL' 'False ('N 'R left1 k1 v1 right1) k2 v2 right2) Source # |
type family DiscriminateBalR (l :: Map k v) (r :: Map k v) :: Bool where ... Source #
DiscriminateBalR _ (N R _ _ _ _) = False | |
DiscriminateBalR _ _ = True |
class BalanceableR (l :: Map Symbol q) (k :: Symbol) (v :: q) (r :: Map Symbol q) where Source #
balRR :: Record f (N color l k v r) -> Record f (BalR l k v r) Source #
balRV :: Variant f (N color l k v r) -> Variant f (BalR l k v r) Source #
Instances
(DiscriminateBalR l r ~ b, BalanceableHelperR b l k v r) => BalanceableR (l :: Map Symbol q) k (v :: q) (r :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal |
class BalanceableHelperR (b :: Bool) (l :: Map Symbol q) (k :: Symbol) (v :: q) (r :: Map Symbol q) where Source #
balRR' :: Record f (N color l k v r) -> Record f (BalR' b l k v r) Source #
balRV' :: Variant f (N color l k v r) -> Variant f (BalR' b l k v r) Source #
Instances
BalanceableHelperR 'False (right2 :: Map Symbol q) k2 (v2 :: q) ('N 'R left1 k1 v1 right1 :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal balRR' :: forall (f :: q0 -> Type) (color :: Color). Record f ('N color right2 k2 v2 ('N 'R left1 k1 v1 right1)) -> Record f (BalR' 'False right2 k2 v2 ('N 'R left1 k1 v1 right1)) Source # balRV' :: forall (f :: q0 -> Type) (color :: Color). Variant f ('N color right2 k2 v2 ('N 'R left1 k1 v1 right1)) -> Variant f (BalR' 'False right2 k2 v2 ('N 'R left1 k1 v1 right1)) Source # | |
('N 'R t2 z zv t3 ~ g, ShouldBalance g t1 ~ shouldbalance, BalanceableHelper shouldbalance g y yv t1) => BalanceableHelperR 'True ('N 'B t2 z zv t3 :: Map Symbol q) y (yv :: q) (t1 :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal balRR' :: forall (f :: q0 -> Type) (color :: Color). Record f ('N color ('N 'B t2 z zv t3) y yv t1) -> Record f (BalR' 'True ('N 'B t2 z zv t3) y yv t1) Source # balRV' :: forall (f :: q0 -> Type) (color :: Color). Variant f ('N color ('N 'B t2 z zv t3) y yv t1) -> Variant f (BalR' 'True ('N 'B t2 z zv t3) y yv t1) Source # | |
('N 'R t2 u uv t3 ~ g, ShouldBalance g l ~ shouldbalance, BalanceableHelper shouldbalance g z zv l) => BalanceableHelperR 'True ('N 'R ('N 'B t2 u uv t3) z zv ('N 'B l k kv r) :: Map Symbol q) y (yv :: q) (t1 :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal balRR' :: forall (f :: q0 -> Type) (color :: Color). Record f ('N color ('N 'R ('N 'B t2 u uv t3) z zv ('N 'B l k kv r)) y yv t1) -> Record f (BalR' 'True ('N 'R ('N 'B t2 u uv t3) z zv ('N 'B l k kv r)) y yv t1) Source # balRV' :: forall (f :: q0 -> Type) (color :: Color). Variant f ('N color ('N 'R ('N 'B t2 u uv t3) z zv ('N 'B l k kv r)) y yv t1) -> Variant f (BalR' 'True ('N 'R ('N 'B t2 u uv t3) z zv ('N 'B l k kv r)) y yv t1) Source # |
class Fuseable (l :: Map Symbol q) (r :: Map Symbol q) where Source #
fuseRecord :: Record f l -> Record f r -> Record f (Fuse l r) Source #
fuseVariant :: Either (Variant f l) (Variant f r) -> Variant f (Fuse l r) Source #
Instances
Fuseable ('E :: Map Symbol q) ('E :: Map Symbol q) Source # | |
Fuseable ('E :: Map Symbol q) ('N color left k v right :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal fuseRecord :: forall (f :: q0 -> Type). Record f 'E -> Record f ('N color left k v right) -> Record f (Fuse 'E ('N color left k v right)) Source # fuseVariant :: forall (f :: q0 -> Type). Either (Variant f 'E) (Variant f ('N color left k v right)) -> Variant f (Fuse 'E ('N color left k v right)) Source # | |
Fuseable ('N color left k v right :: Map Symbol q) ('E :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal fuseRecord :: forall (f :: q0 -> Type). Record f ('N color left k v right) -> Record f 'E -> Record f (Fuse ('N color left k v right) 'E) Source # fuseVariant :: forall (f :: q0 -> Type). Either (Variant f ('N color left k v right)) (Variant f 'E) -> Variant f (Fuse ('N color left k v right) 'E) Source # | |
(Fuseable right1 left2, Fuse right1 left2 ~ fused, FuseableHelper2 fused ('N 'B left1 k1 v1 right1) ('N 'B left2 k2 v2 right2)) => Fuseable ('N 'B left1 k1 v1 right1 :: Map Symbol q) ('N 'B left2 k2 v2 right2 :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal fuseRecord :: forall (f :: q0 -> Type). Record f ('N 'B left1 k1 v1 right1) -> Record f ('N 'B left2 k2 v2 right2) -> Record f (Fuse ('N 'B left1 k1 v1 right1) ('N 'B left2 k2 v2 right2)) Source # fuseVariant :: forall (f :: q0 -> Type). Either (Variant f ('N 'B left1 k1 v1 right1)) (Variant f ('N 'B left2 k2 v2 right2)) -> Variant f (Fuse ('N 'B left1 k1 v1 right1) ('N 'B left2 k2 v2 right2)) Source # | |
Fuseable ('N 'B left1 k1 v1 right1) left2 => Fuseable ('N 'B left1 k1 v1 right1 :: Map Symbol q) ('N 'R left2 k2 v2 right2 :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal fuseRecord :: forall (f :: q0 -> Type). Record f ('N 'B left1 k1 v1 right1) -> Record f ('N 'R left2 k2 v2 right2) -> Record f (Fuse ('N 'B left1 k1 v1 right1) ('N 'R left2 k2 v2 right2)) Source # fuseVariant :: forall (f :: q0 -> Type). Either (Variant f ('N 'B left1 k1 v1 right1)) (Variant f ('N 'R left2 k2 v2 right2)) -> Variant f (Fuse ('N 'B left1 k1 v1 right1) ('N 'R left2 k2 v2 right2)) Source # | |
Fuseable right1 ('N 'B left2 k2 v2 right2) => Fuseable ('N 'R left1 k1 v1 right1 :: Map Symbol q) ('N 'B left2 k2 v2 right2 :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal fuseRecord :: forall (f :: q0 -> Type). Record f ('N 'R left1 k1 v1 right1) -> Record f ('N 'B left2 k2 v2 right2) -> Record f (Fuse ('N 'R left1 k1 v1 right1) ('N 'B left2 k2 v2 right2)) Source # fuseVariant :: forall (f :: q0 -> Type). Either (Variant f ('N 'R left1 k1 v1 right1)) (Variant f ('N 'B left2 k2 v2 right2)) -> Variant f (Fuse ('N 'R left1 k1 v1 right1) ('N 'B left2 k2 v2 right2)) Source # | |
(Fuseable right1 left2, Fuse right1 left2 ~ fused, FuseableHelper1 fused ('N 'R left1 k1 v1 right1) ('N 'R left2 k2 v2 right2)) => Fuseable ('N 'R left1 k1 v1 right1 :: Map Symbol q) ('N 'R left2 k2 v2 right2 :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal fuseRecord :: forall (f :: q0 -> Type). Record f ('N 'R left1 k1 v1 right1) -> Record f ('N 'R left2 k2 v2 right2) -> Record f (Fuse ('N 'R left1 k1 v1 right1) ('N 'R left2 k2 v2 right2)) Source # fuseVariant :: forall (f :: q0 -> Type). Either (Variant f ('N 'R left1 k1 v1 right1)) (Variant f ('N 'R left2 k2 v2 right2)) -> Variant f (Fuse ('N 'R left1 k1 v1 right1) ('N 'R left2 k2 v2 right2)) Source # |
class FuseableHelper1 (fused :: Map Symbol q) (l :: Map Symbol q) (r :: Map Symbol q) where Source #
fuseRecord1 :: Record f l -> Record f r -> Record f (Fuse l r) Source #
fuseVariant1 :: Either (Variant f l) (Variant f r) -> Variant f (Fuse l r) Source #
Instances
FuseableHelper1 ('E :: Map Symbol q) ('N 'R left1 k1 v1 ('E :: Map Symbol q) :: Map Symbol q) ('N 'R ('E :: Map Symbol q) k2 v2 right2 :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal fuseRecord1 :: forall (f :: q0 -> Type). Record f ('N 'R left1 k1 v1 'E) -> Record f ('N 'R 'E k2 v2 right2) -> Record f (Fuse ('N 'R left1 k1 v1 'E) ('N 'R 'E k2 v2 right2)) Source # fuseVariant1 :: forall (f :: q0 -> Type). Either (Variant f ('N 'R left1 k1 v1 'E)) (Variant f ('N 'R 'E k2 v2 right2)) -> Variant f (Fuse ('N 'R left1 k1 v1 'E) ('N 'R 'E k2 v2 right2)) Source # | |
(Fuseable right1 left2, Fuse right1 left2 ~ 'N 'B s1 z zv s2) => FuseableHelper1 ('N 'B s1 z zv s2 :: Map Symbol q) ('N 'R left1 k1 v1 right1 :: Map Symbol q) ('N 'R left2 k2 v2 right2 :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal type Fuse1 ('N 'B s1 z zv s2) ('N 'R left1 k1 v1 right1) ('N 'R left2 k2 v2 right2) :: Map Symbol q Source # fuseRecord1 :: forall (f :: q0 -> Type). Record f ('N 'R left1 k1 v1 right1) -> Record f ('N 'R left2 k2 v2 right2) -> Record f (Fuse ('N 'R left1 k1 v1 right1) ('N 'R left2 k2 v2 right2)) Source # fuseVariant1 :: forall (f :: q0 -> Type). Either (Variant f ('N 'R left1 k1 v1 right1)) (Variant f ('N 'R left2 k2 v2 right2)) -> Variant f (Fuse ('N 'R left1 k1 v1 right1) ('N 'R left2 k2 v2 right2)) Source # | |
(Fuseable right1 left2, Fuse right1 left2 ~ 'N 'R s1 z zv s2) => FuseableHelper1 ('N 'R s1 z zv s2 :: Map Symbol q) ('N 'R left1 k1 v1 right1 :: Map Symbol q) ('N 'R left2 k2 v2 right2 :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal type Fuse1 ('N 'R s1 z zv s2) ('N 'R left1 k1 v1 right1) ('N 'R left2 k2 v2 right2) :: Map Symbol q Source # fuseRecord1 :: forall (f :: q0 -> Type). Record f ('N 'R left1 k1 v1 right1) -> Record f ('N 'R left2 k2 v2 right2) -> Record f (Fuse ('N 'R left1 k1 v1 right1) ('N 'R left2 k2 v2 right2)) Source # fuseVariant1 :: forall (f :: q0 -> Type). Either (Variant f ('N 'R left1 k1 v1 right1)) (Variant f ('N 'R left2 k2 v2 right2)) -> Variant f (Fuse ('N 'R left1 k1 v1 right1) ('N 'R left2 k2 v2 right2)) Source # |
class FuseableHelper2 (fused :: Map Symbol q) (l :: Map Symbol q) (r :: Map Symbol q) where Source #
fuseRecord2 :: Record f l -> Record f r -> Record f (Fuse l r) Source #
fuseVariant2 :: Either (Variant f l) (Variant f r) -> Variant f (Fuse l r) Source #
Instances
BalanceableL left1 k1 v1 ('N 'B ('E :: Map Symbol q) k2 v2 right2) => FuseableHelper2 ('E :: Map Symbol q) ('N 'B left1 k1 v1 ('E :: Map Symbol q) :: Map Symbol q) ('N 'B ('E :: Map Symbol q) k2 v2 right2 :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal fuseRecord2 :: forall (f :: q0 -> Type). Record f ('N 'B left1 k1 v1 'E) -> Record f ('N 'B 'E k2 v2 right2) -> Record f (Fuse ('N 'B left1 k1 v1 'E) ('N 'B 'E k2 v2 right2)) Source # fuseVariant2 :: forall (f :: q0 -> Type). Either (Variant f ('N 'B left1 k1 v1 'E)) (Variant f ('N 'B 'E k2 v2 right2)) -> Variant f (Fuse ('N 'B left1 k1 v1 'E) ('N 'B 'E k2 v2 right2)) Source # | |
(Fuseable right1 left2, Fuse right1 left2 ~ 'N 'B s1 z zv s2, BalanceableL left1 k1 v1 ('N 'B ('N 'B s1 z zv s2) k2 v2 right2)) => FuseableHelper2 ('N 'B s1 z zv s2 :: Map Symbol q) ('N 'B left1 k1 v1 right1 :: Map Symbol q) ('N 'B left2 k2 v2 right2 :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal type Fuse2 ('N 'B s1 z zv s2) ('N 'B left1 k1 v1 right1) ('N 'B left2 k2 v2 right2) :: Map Symbol q Source # fuseRecord2 :: forall (f :: q0 -> Type). Record f ('N 'B left1 k1 v1 right1) -> Record f ('N 'B left2 k2 v2 right2) -> Record f (Fuse ('N 'B left1 k1 v1 right1) ('N 'B left2 k2 v2 right2)) Source # fuseVariant2 :: forall (f :: q0 -> Type). Either (Variant f ('N 'B left1 k1 v1 right1)) (Variant f ('N 'B left2 k2 v2 right2)) -> Variant f (Fuse ('N 'B left1 k1 v1 right1) ('N 'B left2 k2 v2 right2)) Source # | |
(Fuseable right1 left2, Fuse right1 left2 ~ 'N 'R s1 z zv s2) => FuseableHelper2 ('N 'R s1 z zv s2 :: Map Symbol q) ('N 'B left1 k1 v1 right1 :: Map Symbol q) ('N 'B left2 k2 v2 right2 :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal type Fuse2 ('N 'R s1 z zv s2) ('N 'B left1 k1 v1 right1) ('N 'B left2 k2 v2 right2) :: Map Symbol q Source # fuseRecord2 :: forall (f :: q0 -> Type). Record f ('N 'B left1 k1 v1 right1) -> Record f ('N 'B left2 k2 v2 right2) -> Record f (Fuse ('N 'B left1 k1 v1 right1) ('N 'B left2 k2 v2 right2)) Source # fuseVariant2 :: forall (f :: q0 -> Type). Either (Variant f ('N 'B left1 k1 v1 right1)) (Variant f ('N 'B left2 k2 v2 right2)) -> Variant f (Fuse ('N 'B left1 k1 v1 right1) ('N 'B left2 k2 v2 right2)) Source # |
class Delable (k :: Symbol) (v :: q) (t :: Map Symbol q) where Source #
del :: Record f t -> Record f (Del k v t) Source #
win :: Variant f t -> Either (Variant f (Del k v t)) (f v) Source #
class DelableL (k :: Symbol) (v :: q) (l :: Map Symbol q) (kx :: Symbol) (vx :: q) (r :: Map Symbol q) where Source #
delL :: Record f (N color l kx vx r) -> Record f (DelL k v l kx vx r) Source #
winL :: Variant f (N color l kx vx r) -> Either (Variant f (DelL k v l kx vx r)) (f v) Source #
Instances
DelableL k (v :: q) ('E :: Map Symbol q) kx (vx :: q) (right :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal | |
('N 'B leftz kz vz rightz ~ g, Delable k v g, Del k v g ~ deleted, BalanceableL deleted kx vx right) => DelableL k (v :: q) ('N 'B leftz kz vz rightz :: Map Symbol q) kx (vx :: q) (right :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal delL :: forall (f :: q0 -> Type) (color :: Color). Record f ('N color ('N 'B leftz kz vz rightz) kx vx right) -> Record f (DelL k v ('N 'B leftz kz vz rightz) kx vx right) Source # winL :: forall f (color :: Color). Variant f ('N color ('N 'B leftz kz vz rightz) kx vx right) -> Either (Variant f (DelL k v ('N 'B leftz kz vz rightz) kx vx right)) (f v) Source # | |
Delable k v ('N 'R leftz kz vz rightz) => DelableL k (v :: q) ('N 'R leftz kz vz rightz :: Map Symbol q) kx (vx :: q) (right :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal delL :: forall (f :: q0 -> Type) (color :: Color). Record f ('N color ('N 'R leftz kz vz rightz) kx vx right) -> Record f (DelL k v ('N 'R leftz kz vz rightz) kx vx right) Source # winL :: forall f (color :: Color). Variant f ('N color ('N 'R leftz kz vz rightz) kx vx right) -> Either (Variant f (DelL k v ('N 'R leftz kz vz rightz) kx vx right)) (f v) Source # |
class DelableR (k :: Symbol) (v :: q) (l :: Map Symbol q) (kx :: Symbol) (vx :: q) (r :: Map Symbol q) where Source #
delR :: Record f (N color l kx vx r) -> Record f (DelR k v l kx vx r) Source #
winR :: Variant f (N color l kx vx r) -> Either (Variant f (DelR k v l kx vx r)) (f v) Source #
Instances
DelableR k (v :: q) (left :: Map Symbol q) kx (vx :: q) ('E :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal | |
('N 'B leftz kz vz rightz ~ g, Delable k v g, Del k v g ~ deleted, BalanceableR left kx vx deleted) => DelableR k (v :: q) (left :: Map Symbol q) kx (vx :: q) ('N 'B leftz kz vz rightz :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal delR :: forall (f :: q0 -> Type) (color :: Color). Record f ('N color left kx vx ('N 'B leftz kz vz rightz)) -> Record f (DelR k v left kx vx ('N 'B leftz kz vz rightz)) Source # winR :: forall f (color :: Color). Variant f ('N color left kx vx ('N 'B leftz kz vz rightz)) -> Either (Variant f (DelR k v left kx vx ('N 'B leftz kz vz rightz))) (f v) Source # | |
Delable k v ('N 'R leftz kz vz rightz) => DelableR k (v :: q) (left :: Map Symbol q) kx (vx :: q) ('N 'R leftz kz vz rightz :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal delR :: forall (f :: q0 -> Type) (color :: Color). Record f ('N color left kx vx ('N 'R leftz kz vz rightz)) -> Record f (DelR k v left kx vx ('N 'R leftz kz vz rightz)) Source # winR :: forall f (color :: Color). Variant f ('N color left kx vx ('N 'R leftz kz vz rightz)) -> Either (Variant f (DelR k v left kx vx ('N 'R leftz kz vz rightz))) (f v) Source # |
class DelableHelper (ordering :: Ordering) (k :: Symbol) (v :: q) (l :: Map Symbol q) (kx :: Symbol) (vx :: q) (r :: Map Symbol q) where Source #
del' :: Record f (N color l kx vx r) -> Record f (Del' ordering k v l kx vx r) Source #
win' :: Variant f (N color l kx vx r) -> Either (Variant f (Del' ordering k v l kx vx r)) (f v) Source #
Instances
Fuseable left right => DelableHelper 'EQ k (v :: q) (left :: Map Symbol q) k (v :: q) (right :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal | |
DelableL k v left kx vx right => DelableHelper 'GT k (v :: q) (left :: Map Symbol q) kx (vx :: q) (right :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal | |
DelableR k v left kx vx right => DelableHelper 'LT k (v :: q) (left :: Map Symbol q) kx (vx :: q) (right :: Map Symbol q) Source # | |
Defined in Data.RBR.Internal |
class Deletable (k :: Symbol) (v :: q) (t :: Map Symbol q) where Source #
Class that determines if the pair of a Symbol
key and a type can
be deleted from a type-level map.
The associated type family Delete
produces the resulting map.
At the term level, this manifests in delete
, which removes a field from
a record, and in winnow
, which checks if a Variant
is of a given
branch and returns the value in the branch if there's a match, or a
reduced Variant
if there isn't. winnow
tends to be more useful in
practice.
If the map already has the key but with a different type, the deletion fails to compile.
_delete :: Record f t -> Record f (Delete k v t) Source #
_winnow :: Variant f t -> Either (Variant f (Delete k v t)) (f v) Source #
delete :: forall k v t f. Deletable k v t => Record f t -> Record f (Delete k v t) Source #
Removes a field from a Record
.
winnow :: forall k v t f. Deletable k v t => Variant f t -> Either (Variant f (Delete k v t)) (f v) Source #
winnowI :: forall k v t. Deletable k v t => Variant I t -> Either (Variant I (Delete k v t)) v Source #
Like winnow
but specialized to pure Variant
s.
>>>
winnow @"bar" @Bool (injectI @"bar" False :: Variant I (FromList [ '("foo",Char), '("bar",Bool) ]))
Right (I False)
>>>
prettyShow_VariantI `first` winnow @"foo" @Char (injectI @"bar" False :: Variant I (FromList [ '("foo",Char), '("bar",Bool) ]))
Left "bar (False)"