Safe Haskell | None |
---|---|
Language | Haskell2010 |
The HList library
(C) 2004, Oleg Kiselyov, Ralf Laemmel, Keean Schupke
Type-indexed co-products. The public interface is exposed in CommonMain#TIC
(There are other ways: see ConsUnion.hs, for example)
- newtype TIC (l :: [*]) = TIC (Variant l)
- ticVariant :: (Functor f, Profunctor p) => p (Variant l1) (f (Variant l2)) -> p (TIC l1) (f (TIC l2))
- ticVariant' :: (Profunctor p, Functor f) => p (Variant l) (f (Variant l)) -> p (TIC l) (f (TIC l))
- class TypeIndexed r tr | r -> tr, tr -> r where
- type TypeIndexedCxt s t a b = (HMapCxt HList TaggedFn b t, RecordValues s, RecordValues t, a ~ RecordValuesR s, b ~ RecordValuesR t, SameLabels s t, SameLength s t, SameLength b a, Coercible (TagR b) t, Coercible (TagR a) s, HAllTaggedLV s, HRLabelSet t, TagUntag a, TagUntag b)
- typeIndexed' :: ((~#) [*] [*] (RecordValuesR (TagR b)) b, Functor f, Profunctor p, TagUntagFD b (TagR b), HLabelSet [*] (LabelsOf (TagR b)), HAllTaggedLV (TagR b), SameLength' * * b b, SameLength' * * (TagR b) (TagR b), SameLabels [*] [*] (TagR b) (TagR b), RecordValues (TagR b), HMapAux HList TaggedFn b (TagR b), TypeIndexed r tr) => p (tr (TagR b)) (f (tr (TagR b))) -> p (r (TagR b)) (f (r (TagR b)))
- mkTIC' :: forall i l proxy. (HTypeIndexed l, MkVariant i i l) => i -> proxy l -> TIC l
- mkTIC1 :: forall i. MkVariant i i '[Tagged i i] => i -> TIC '[Tagged i i]
- mkTIC :: (HAllTaggedEq l, HLabelSet [*] (LabelsOf l), HAllTaggedLV l, KnownNat (HNat2Nat n), HasField * i (Record l) i, HFind1 * i (UnLabel * i (LabelsOf l)) (UnLabel * i (LabelsOf l)) n) => i -> TIC l
- class TICPrism s t a b | s a b -> t, t a b -> s where
- ticPrism' :: forall s t a b. (HPrism a s t a b, a ~ b, s ~ t) => forall f p. (Applicative f, Choice p) => (a `p` f b) -> TIC s `p` f (TIC t)
Documentation
newtype TIC (l :: [*]) Source #
A datatype for type-indexed co-products. A TIC
is just a Variant
,
where the elements of the type-level list "l"
are in the form
Tagged x x
.
TypeIndexed Variant TIC Source # | |
HMapAux Variant f xs ys => HMapAux TIC f xs ys Source # | |
(TICPrism s t a b, (~) * (Label k x) (Label * a), (~) * a b, (~) [*] s t, SameLength * * s t) => Labelable k x TIC s t a b Source # | hLens' :: Label a -> Prism' (TIC s) a note that a more general function Note: `x :: k` according to the instance head, but the instance body forces the kind variable to be * later on. IE. (k ~ *) |
(HasField * o (TIC l) mo, (~) * mo (Maybe o)) => HOccurs mo (TIC l) Source # | |
((~) * me (Maybe e), HOccursNot * (Tagged * e e) l) => HExtend me (TIC l) Source # | Nothing .*. x = x Just a .*. y = mkTIC a |
Bounded (Variant l) => Bounded (TIC l) Source # | |
Enum (Variant l) => Enum (TIC l) Source # | |
Eq (Variant l) => Eq (TIC l) Source # | |
Ord (Variant l) => Ord (TIC l) Source # | |
(ReadVariant l, HAllTaggedEq l, HRLabelSet l) => Read (TIC l) Source # | |
ShowVariant l => Show (TIC l) Source # | TICs are not opaque |
Ix (Variant l) => Ix (TIC l) Source # | |
Semigroup (Variant l) => Semigroup (TIC l) Source # | |
Monoid (Variant l) => Monoid (TIC l) Source # | |
HasField * o (Variant l) (Maybe o) => HasField * o (TIC l) (Maybe o) Source # | Public destructor (or, open union's projection function) |
type LabelableTy TIC Source # | |
type HExtendR me (TIC l) Source # | |
ticVariant :: (Functor f, Profunctor p) => p (Variant l1) (f (Variant l2)) -> p (TIC l1) (f (TIC l2)) Source #
Iso (TIC s) (TIC t) (Variant s) (Variant t)
typeIndexed
may be more appropriate
ticVariant' :: (Profunctor p, Functor f) => p (Variant l) (f (Variant l)) -> p (TIC l) (f (TIC l)) Source #
Iso' (TIC s) (Variant s)
class TypeIndexed r tr | r -> tr, tr -> r where Source #
Conversion between type indexed collections (TIC
and TIP
)
and the corresponding collection that has other label types (Variant
and Record
respectively)
See typeIndexed'
typeIndexed :: forall p f s t a b. (TypeIndexedCxt s t a b, Profunctor p, Functor f) => p (tr (TagR a)) (f (tr (TagR b))) -> p (r s) (f (r t)) Source #
Iso (r s) (r t) (tr a) (tr b)
type TypeIndexedCxt s t a b = (HMapCxt HList TaggedFn b t, RecordValues s, RecordValues t, a ~ RecordValuesR s, b ~ RecordValuesR t, SameLabels s t, SameLength s t, SameLength b a, Coercible (TagR b) t, Coercible (TagR a) s, HAllTaggedLV s, HRLabelSet t, TagUntag a, TagUntag b) Source #
typeIndexed' :: ((~#) [*] [*] (RecordValuesR (TagR b)) b, Functor f, Profunctor p, TagUntagFD b (TagR b), HLabelSet [*] (LabelsOf (TagR b)), HAllTaggedLV (TagR b), SameLength' * * b b, SameLength' * * (TagR b) (TagR b), SameLabels [*] [*] (TagR b) (TagR b), RecordValues (TagR b), HMapAux HList TaggedFn b (TagR b), TypeIndexed r tr) => p (tr (TagR b)) (f (tr (TagR b))) -> p (r (TagR b)) (f (r (TagR b))) Source #
:: (HTypeIndexed l, MkVariant i i l) | |
=> i | |
-> proxy l | the ordering of types in the |
-> TIC l |
Public constructor (or, open union's injection function)
mkTIC1 :: forall i. MkVariant i i '[Tagged i i] => i -> TIC '[Tagged i i] Source #
make a TIC that contains one element
mkTIC :: (HAllTaggedEq l, HLabelSet [*] (LabelsOf l), HAllTaggedLV l, KnownNat (HNat2Nat n), HasField * i (Record l) i, HFind1 * i (UnLabel * i (LabelsOf l)) (UnLabel * i (LabelsOf l)) n) => i -> TIC l Source #
make a TIC for use in contexts where the result type is fixed
class TICPrism s t a b | s a b -> t, t a b -> s where Source #
similar to HPrism
ticPrism :: (SameLength s t, Choice p, Applicative f) => (a `p` f b) -> TIC s `p` f (TIC t) Source #
(MkVariant * b b t, HasField * a (Variant s) (Maybe a), SameLength * * s t, HFindLabel * b t n, HFindLabel * a s n, (~) [*] (HUpdateAtHNatR n (Tagged * b b) s) t, (~) [*] (HUpdateAtHNatR n (Tagged * a a) t) s) => TICPrism s t a b Source # | |