Safe Haskell | None |
---|---|
Language | Haskell2010 |
Open sum type
Synopsis
- data Variant (l :: [*])
- type V = Variant
- variantIndex :: Variant a -> Word
- pattern V :: forall c cs. Popable c cs => c -> Variant cs
- pattern VMaybe :: forall c cs. MaybePopable c cs => c -> Variant cs
- type (:<) a xs = Popable a xs
- type (:<?) a xs = MaybePopable a xs
- toVariantAt :: forall (n :: Nat) (l :: [*]). KnownNat n => Index n l -> Variant l
- toVariantHead :: forall x xs. x -> Variant (x ': xs)
- toVariantTail :: forall x xs. Variant xs -> Variant (x ': xs)
- fromVariantAt :: forall (n :: Nat) (l :: [*]). KnownNat n => Variant l -> Maybe (Index n l)
- popVariantAt :: forall (n :: Nat) l. KnownNat n => Variant l -> Either (Variant (RemoveAt n l)) (Index n l)
- popVariantHead :: forall x xs. Variant (x ': xs) -> Either (Variant xs) x
- updateVariantAt :: forall (n :: Nat) a b l. (KnownNat n, a ~ Index n l) => (a -> b) -> Variant l -> Variant (ReplaceN n b l)
- foldMapVariantAt :: forall (n :: Nat) l l2. (KnownNat n, KnownNat (Length l2)) => (Index n l -> Variant l2) -> Variant l -> Variant (ReplaceAt n l l2)
- foldMapVariantAtM :: forall (n :: Nat) m l l2. (KnownNat n, KnownNat (Length l2), Monad m) => (Index n l -> m (Variant l2)) -> Variant l -> m (Variant (ReplaceAt n l l2))
- toVariant :: forall a l. Member a l => a -> Variant l
- type Member (x :: k) (xs :: [k]) = (IsMember x xs ~ True, x ~ Index (IndexOf x xs) xs, KnownNat (IndexOf x xs))
- type family Filter (a :: k) (l :: [k]) :: [k] where ...
- type Popable a xs = (Member a xs, PopVariant a xs)
- type MaybePopable a xs = PopVariant a xs
- popVariant :: forall a xs. Popable a xs => Variant xs -> Either (Variant (Filter a xs)) a
- popVariantMaybe :: forall a xs. MaybePopable a xs => Variant xs -> Either (Variant (Filter a xs)) a
- fromVariant :: forall a xs. Popable a xs => Variant xs -> Maybe a
- fromVariantMaybe :: forall a xs. MaybePopable a xs => Variant xs -> Maybe a
- fromVariantFirst :: forall a l. Member a l => Variant l -> Maybe a
- updateVariantFirst :: forall a b n l. (Member a l, n ~ IndexOf a l) => (a -> b) -> Variant l -> Variant (ReplaceN n b l)
- updateVariantFirstM :: forall (n :: Nat) l l2 m. (KnownNat n, Monad m) => (Index n l -> m (Index n l2)) -> Variant l -> m (Variant l2)
- type MappableVariant a b cs = MapVariant a b cs (IndexesOf a cs)
- mapVariant :: forall a b cs. MappableVariant a b cs => (a -> b) -> Variant cs -> Variant (ReplaceNS (IndexesOf a cs) b cs)
- foldMapVariantFirst :: forall a (n :: Nat) l l2. (KnownNat n, KnownNat (Length l2), n ~ IndexOf a l, a ~ Index n l) => (a -> Variant l2) -> Variant l -> Variant (ReplaceAt n l l2)
- foldMapVariantFirstM :: forall a (n :: Nat) l l2 m. (KnownNat n, KnownNat (Length l2), n ~ IndexOf a l, a ~ Index n l, Monad m) => (a -> m (V l2)) -> V l -> m (V (ReplaceAt n l l2))
- foldMapVariant :: forall a cs ds i. (i ~ IndexOf a cs, Popable a cs) => (a -> V ds) -> V cs -> V (InsertAt i (Filter a cs) ds)
- class AlterVariant c (b :: [*])
- class TraverseVariant c (b :: [*]) m
- class NoConstraint a
- alterVariant :: forall c (a :: [*]). AlterVariant c a => (forall x. c x => x -> x) -> Variant a -> Variant a
- traverseVariant :: forall c (a :: [*]) m. (TraverseVariant c a m, Monad m) => (forall x. c x => x -> m x) -> Variant a -> m (Variant a)
- traverseVariant_ :: forall c (a :: [*]) m. (TraverseVariant c a m, Monad m) => (forall x. c x => x -> m ()) -> Variant a -> m ()
- appendVariant :: forall (ys :: [*]) (xs :: [*]). Variant xs -> Variant (Concat xs ys)
- prependVariant :: forall (ys :: [*]) (xs :: [*]). KnownNat (Length ys) => Variant xs -> Variant (Concat ys xs)
- type Liftable xs ys = (IsSubset xs ys ~ True, LiftVariant xs ys)
- liftVariant :: forall xs ys. Liftable xs ys => Variant xs -> Variant ys
- nubVariant :: Liftable xs (Nub xs) => V xs -> V (Nub xs)
- productVariant :: forall xs ys. KnownNat (Length ys) => Variant xs -> Variant ys -> Variant (Product xs ys)
- class Flattenable a rs
- type family FlattenVariant (xs :: [*]) :: [*] where ...
- flattenVariant :: forall xs. Flattenable (Variant xs) (Variant (FlattenVariant xs)) => Variant xs -> Variant (FlattenVariant xs)
- type family ExtractMonad m f where ...
- joinVariant :: forall m xs ys. (Applicative m, ys ~ ExtractMonad m xs) => Variant xs -> m (Variant ys)
- variantToValue :: Variant '[a] -> a
- variantFromValue :: a -> Variant '[a]
- variantToEither :: forall a b. Variant '[a, b] -> Either b a
- variantFromEither :: Either a b -> Variant '[b, a]
- variantToHList :: VariantToHList xs => Variant xs -> HList (Map Maybe xs)
- variantToTuple :: forall l t. (VariantToHList l, HTuple' (Map Maybe l) t) => Variant l -> t
- class ContVariant xs where
- pattern V' :: forall c cs. (Member' c cs, PopVariant c cs) => c -> Variant cs
- liftVariant' :: LiftVariant xs ys => Variant xs -> Variant ys
- fromVariant' :: forall a xs. PopVariant a xs => Variant xs -> Maybe a
- popVariant' :: PopVariant a xs => Variant xs -> Either (Variant (Filter a xs)) a
- toVariant' :: forall a l. Member' a l => a -> Variant l
- class LiftVariant xs ys
- class PopVariant a xs
Documentation
data Variant (l :: [*]) Source #
A variant contains a value whose type is at the given position in the type list
Instances
(Eq (Variant xs), Eq x) => Eq (Variant (x ': xs)) Source # | |
Eq (Variant ([] :: [*])) Source # | |
(Ord (Variant xs), Ord x) => Ord (Variant (x ': xs)) Source # | |
Defined in Haskus.Utils.Variant compare :: Variant (x ': xs) -> Variant (x ': xs) -> Ordering # (<) :: Variant (x ': xs) -> Variant (x ': xs) -> Bool # (<=) :: Variant (x ': xs) -> Variant (x ': xs) -> Bool # (>) :: Variant (x ': xs) -> Variant (x ': xs) -> Bool # (>=) :: Variant (x ': xs) -> Variant (x ': xs) -> Bool # max :: Variant (x ': xs) -> Variant (x ': xs) -> Variant (x ': xs) # min :: Variant (x ': xs) -> Variant (x ': xs) -> Variant (x ': xs) # | |
Ord (Variant ([] :: [*])) Source # | |
(Show (Variant xs), Show x) => Show (Variant (x ': xs)) Source # | |
Show (Variant ([] :: [*])) Source # | |
Flattenable (Variant ([] :: [*])) rs Source # | |
Defined in Haskus.Utils.Variant toFlattenVariant :: Word -> Variant [] -> rs | |
(Flattenable (Variant ys) (Variant rs), KnownNat (Length xs)) => Flattenable (Variant (Variant xs ': ys)) (Variant rs) Source # | |
Defined in Haskus.Utils.Variant toFlattenVariant :: Word -> Variant (Variant xs ': ys) -> Variant rs |
variantIndex :: Variant a -> Word Source #
Get Variant index
Patterns
pattern V :: forall c cs. Popable c cs => c -> Variant cs Source #
Pattern synonym for Variant
Usage: case v of V (x :: Int) -> ... V (x :: String) -> ...
pattern VMaybe :: forall c cs. MaybePopable c cs => c -> Variant cs Source #
Statically unchecked matching on a Variant
type (:<?) a xs = MaybePopable a xs Source #
Operations by index
toVariantAt :: forall (n :: Nat) (l :: [*]). KnownNat n => Index n l -> Variant l Source #
Set the value with the given indexed type
toVariantHead :: forall x xs. x -> Variant (x ': xs) Source #
Set the first value
toVariantTail :: forall x xs. Variant xs -> Variant (x ': xs) Source #
Set the tail
fromVariantAt :: forall (n :: Nat) (l :: [*]). KnownNat n => Variant l -> Maybe (Index n l) Source #
Get the value if it has the indexed type
popVariantAt :: forall (n :: Nat) l. KnownNat n => Variant l -> Either (Variant (RemoveAt n l)) (Index n l) Source #
Pop a variant value by index, return either the value or the remaining variant
popVariantHead :: forall x xs. Variant (x ': xs) -> Either (Variant xs) x Source #
Pop the head of a variant value
updateVariantAt :: forall (n :: Nat) a b l. (KnownNat n, a ~ Index n l) => (a -> b) -> Variant l -> Variant (ReplaceN n b l) Source #
Update a variant value
foldMapVariantAt :: forall (n :: Nat) l l2. (KnownNat n, KnownNat (Length l2)) => (Index n l -> Variant l2) -> Variant l -> Variant (ReplaceAt n l l2) Source #
Update a variant value with a variant and fold the result
foldMapVariantAtM :: forall (n :: Nat) m l l2. (KnownNat n, KnownNat (Length l2), Monad m) => (Index n l -> m (Variant l2)) -> Variant l -> m (Variant (ReplaceAt n l l2)) Source #
Update a variant value with a variant and fold the result
Operations by type
toVariant :: forall a l. Member a l => a -> Variant l Source #
Put a value into a Variant
Use the first matching type index.
type Member (x :: k) (xs :: [k]) = (IsMember x xs ~ True, x ~ Index (IndexOf x xs) xs, KnownNat (IndexOf x xs)) #
Constraint: x member of xs
type Popable a xs = (Member a xs, PopVariant a xs) Source #
a is popable in xs
type MaybePopable a xs = PopVariant a xs Source #
a may be popable in xs
popVariant :: forall a xs. Popable a xs => Variant xs -> Either (Variant (Filter a xs)) a Source #
Extract a type from a variant. Return either the value of this type or the remaining variant
popVariantMaybe :: forall a xs. MaybePopable a xs => Variant xs -> Either (Variant (Filter a xs)) a Source #
Extract a type from a variant. Return either the value of this type or the remaining variant
fromVariant :: forall a xs. Popable a xs => Variant xs -> Maybe a Source #
Try to a get a value of a given type from a Variant
fromVariantMaybe :: forall a xs. MaybePopable a xs => Variant xs -> Maybe a Source #
Try to a get a value of a given type from a Variant that may not even support the given type.
fromVariantFirst :: forall a l. Member a l => Variant l -> Maybe a Source #
Pick the first matching type of a Variant
fromVariantFirst @A (Variant 2 undefined :: Variant '[A,B,A]) == Nothing
updateVariantFirst :: forall a b n l. (Member a l, n ~ IndexOf a l) => (a -> b) -> Variant l -> Variant (ReplaceN n b l) Source #
Update a variant value
updateVariantFirstM :: forall (n :: Nat) l l2 m. (KnownNat n, Monad m) => (Index n l -> m (Index n l2)) -> Variant l -> m (Variant l2) Source #
Monadic update of the first matching variant value
type MappableVariant a b cs = MapVariant a b cs (IndexesOf a cs) Source #
mapVariant :: forall a b cs. MappableVariant a b cs => (a -> b) -> Variant cs -> Variant (ReplaceNS (IndexesOf a cs) b cs) Source #
Map the matching types of a variant
foldMapVariantFirst :: forall a (n :: Nat) l l2. (KnownNat n, KnownNat (Length l2), n ~ IndexOf a l, a ~ Index n l) => (a -> Variant l2) -> Variant l -> Variant (ReplaceAt n l l2) Source #
Update a variant value with a variant and fold the result
foldMapVariantFirstM :: forall a (n :: Nat) l l2 m. (KnownNat n, KnownNat (Length l2), n ~ IndexOf a l, a ~ Index n l, Monad m) => (a -> m (V l2)) -> V l -> m (V (ReplaceAt n l l2)) Source #
Update a variant value with a variant and fold the result
foldMapVariant :: forall a cs ds i. (i ~ IndexOf a cs, Popable a cs) => (a -> V ds) -> V cs -> V (InsertAt i (Filter a cs) ds) Source #
Update a variant value with a variant and fold the result
Generic operations with type classes
class AlterVariant c (b :: [*]) Source #
alterVariant'
Instances
AlterVariant c ([] :: [*]) Source # | |
Defined in Haskus.Utils.Variant alterVariant' :: Alter c -> Word -> Any -> Any | |
(AlterVariant c xs, c x) => AlterVariant c (x ': xs) Source # | |
Defined in Haskus.Utils.Variant alterVariant' :: Alter c -> Word -> Any -> Any |
class TraverseVariant c (b :: [*]) m Source #
traverseVariant'
Instances
TraverseVariant c ([] :: [*]) m Source # | |
Defined in Haskus.Utils.Variant traverseVariant' :: AlterM c m -> Word -> Any -> m Any | |
(TraverseVariant c xs m, c x, Monad m) => TraverseVariant c (x ': xs) m Source # | |
Defined in Haskus.Utils.Variant traverseVariant' :: AlterM c m -> Word -> Any -> m Any |
class NoConstraint a Source #
Useful to specify a "* -> Constraint" function returning no constraint
Instances
NoConstraint a Source # | |
Defined in Haskus.Utils.Variant |
alterVariant :: forall c (a :: [*]). AlterVariant c a => (forall x. c x => x -> x) -> Variant a -> Variant a Source #
Alter a variant. You need to specify the constraints required by the modifying function.
Usage:
alterVariant NoConstraint id v
alterVariant
Resizable (resize 4) v
class (Ord a, Num a) => OrdNum a instance (Ord a, Num a) => OrdNum a
traverseVariant :: forall c (a :: [*]) m. (TraverseVariant c a m, Monad m) => (forall x. c x => x -> m x) -> Variant a -> m (Variant a) Source #
Traverse a variant. You need to specify the constraints required by the modifying function.
traverseVariant_ :: forall c (a :: [*]) m. (TraverseVariant c a m, Monad m) => (forall x. c x => x -> m ()) -> Variant a -> m () Source #
Traverse a variant. You need to specify the constraints required by the modifying function.
Conversions between variants
appendVariant :: forall (ys :: [*]) (xs :: [*]). Variant xs -> Variant (Concat xs ys) Source #
Extend a variant by appending other possible values
prependVariant :: forall (ys :: [*]) (xs :: [*]). KnownNat (Length ys) => Variant xs -> Variant (Concat ys xs) Source #
Extend a variant by prepending other possible values
liftVariant :: forall xs ys. Liftable xs ys => Variant xs -> Variant ys Source #
Lift a variant into another
Set values to the first matching type
productVariant :: forall xs ys. KnownNat (Length ys) => Variant xs -> Variant ys -> Variant (Product xs ys) Source #
Product of two variants
class Flattenable a rs Source #
toFlattenVariant
Instances
Flattenable (Variant ([] :: [*])) rs Source # | |
Defined in Haskus.Utils.Variant toFlattenVariant :: Word -> Variant [] -> rs | |
(Flattenable (Variant ys) (Variant rs), KnownNat (Length xs)) => Flattenable (Variant (Variant xs ': ys)) (Variant rs) Source # | |
Defined in Haskus.Utils.Variant toFlattenVariant :: Word -> Variant (Variant xs ': ys) -> Variant rs |
type family FlattenVariant (xs :: [*]) :: [*] where ... Source #
FlattenVariant '[] = '[] | |
FlattenVariant (Variant xs ': ys) = Concat xs (FlattenVariant ys) | |
FlattenVariant (y ': ys) = y ': FlattenVariant ys |
flattenVariant :: forall xs. Flattenable (Variant xs) (Variant (FlattenVariant xs)) => Variant xs -> Variant (FlattenVariant xs) Source #
Flatten variants in a variant
type family ExtractMonad m f where ... Source #
ExtractMonad m '[m x] = '[x] | |
ExtractMonad m (m x ': xs) = x ': ExtractMonad m xs |
joinVariant :: forall m xs ys. (Applicative m, ys ~ ExtractMonad m xs) => Variant xs -> m (Variant ys) Source #
Join on a variant
Transform a variant of applicatives as follow: V'[m a, m b, m c] ===> m (V'[a,b,c])
Conversions to/from other data types
variantToValue :: Variant '[a] -> a Source #
Retrieve a single value
variantFromValue :: a -> Variant '[a] Source #
Create a variant from a single value
variantToEither :: forall a b. Variant '[a, b] -> Either b a Source #
Convert a variant of two values in a Either
variantFromEither :: Either a b -> Variant '[b, a] Source #
Lift an Either into a Variant (reversed order by convention)
variantToHList :: VariantToHList xs => Variant xs -> HList (Map Maybe xs) Source #
Convert a variant into a HList of Maybes
variantToTuple :: forall l t. (VariantToHList l, HTuple' (Map Maybe l) t) => Variant l -> t Source #
Get variant possible values in a tuple of Maybe types
Continuations
class ContVariant xs where Source #
variantToCont :: Variant xs -> ContFlow xs r Source #
Convert a variant into a multi-continuation
variantToContM :: Monad m => m (Variant xs) -> ContFlow xs (m r) Source #
Convert a variant into a multi-continuation
contToVariant :: ContFlow xs (Variant xs) -> Variant xs Source #
Convert a multi-continuation into a Variant
contToVariantM :: Monad m => ContFlow xs (m (Variant xs)) -> m (Variant xs) Source #
Convert a multi-continuation into a Variant
Instances
ContVariant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': (k ': (l ': ([] :: [*]))))))))))))) Source # | |
Defined in Haskus.Utils.Variant variantToCont :: Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': (k ': (l ': [])))))))))))) -> ContFlow (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': (k ': (l ': [])))))))))))) r Source # variantToContM :: Monad m => m (Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': (k ': (l ': []))))))))))))) -> ContFlow (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': (k ': (l ': [])))))))))))) (m r) Source # contToVariant :: ContFlow (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': (k ': (l ': [])))))))))))) (Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': (k ': (l ': []))))))))))))) -> Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': (k ': (l ': [])))))))))))) Source # contToVariantM :: Monad m => ContFlow (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': (k ': (l ': [])))))))))))) (m (Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': (k ': (l ': [])))))))))))))) -> m (Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': (k ': (l ': []))))))))))))) Source # | |
ContVariant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': (k ': ([] :: [*])))))))))))) Source # | |
Defined in Haskus.Utils.Variant variantToCont :: Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': (k ': []))))))))))) -> ContFlow (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': (k ': []))))))))))) r Source # variantToContM :: Monad m => m (Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': (k ': [])))))))))))) -> ContFlow (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': (k ': []))))))))))) (m r) Source # contToVariant :: ContFlow (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': (k ': []))))))))))) (Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': (k ': [])))))))))))) -> Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': (k ': []))))))))))) Source # contToVariantM :: Monad m => ContFlow (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': (k ': []))))))))))) (m (Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': (k ': []))))))))))))) -> m (Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': (k ': [])))))))))))) Source # | |
ContVariant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': ([] :: [*]))))))))))) Source # | |
Defined in Haskus.Utils.Variant variantToCont :: Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': [])))))))))) -> ContFlow (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': [])))))))))) r Source # variantToContM :: Monad m => m (Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': []))))))))))) -> ContFlow (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': [])))))))))) (m r) Source # contToVariant :: ContFlow (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': [])))))))))) (Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': []))))))))))) -> Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': [])))))))))) Source # contToVariantM :: Monad m => ContFlow (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': [])))))))))) (m (Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': [])))))))))))) -> m (Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': []))))))))))) Source # | |
ContVariant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': ([] :: [*])))))))))) Source # | |
Defined in Haskus.Utils.Variant variantToCont :: Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': []))))))))) -> ContFlow (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': []))))))))) r Source # variantToContM :: Monad m => m (Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': [])))))))))) -> ContFlow (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': []))))))))) (m r) Source # contToVariant :: ContFlow (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': []))))))))) (Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': [])))))))))) -> Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': []))))))))) Source # contToVariantM :: Monad m => ContFlow (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': []))))))))) (m (Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': []))))))))))) -> m (Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': [])))))))))) Source # | |
ContVariant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': ([] :: [*]))))))))) Source # | |
Defined in Haskus.Utils.Variant variantToCont :: Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': [])))))))) -> ContFlow (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': [])))))))) r Source # variantToContM :: Monad m => m (Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': []))))))))) -> ContFlow (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': [])))))))) (m r) Source # contToVariant :: ContFlow (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': [])))))))) (Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': []))))))))) -> Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': [])))))))) Source # contToVariantM :: Monad m => ContFlow (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': [])))))))) (m (Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': [])))))))))) -> m (Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': []))))))))) Source # | |
ContVariant (a ': (b ': (c ': (d ': (e ': (f ': (g ': ([] :: [*])))))))) Source # | |
Defined in Haskus.Utils.Variant variantToCont :: Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': []))))))) -> ContFlow (a ': (b ': (c ': (d ': (e ': (f ': (g ': []))))))) r Source # variantToContM :: Monad m => m (Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': [])))))))) -> ContFlow (a ': (b ': (c ': (d ': (e ': (f ': (g ': []))))))) (m r) Source # contToVariant :: ContFlow (a ': (b ': (c ': (d ': (e ': (f ': (g ': []))))))) (Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': [])))))))) -> Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': []))))))) Source # contToVariantM :: Monad m => ContFlow (a ': (b ': (c ': (d ': (e ': (f ': (g ': []))))))) (m (Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': []))))))))) -> m (Variant (a ': (b ': (c ': (d ': (e ': (f ': (g ': [])))))))) Source # | |
ContVariant (a ': (b ': (c ': (d ': (e ': (f ': ([] :: [*]))))))) Source # | |
Defined in Haskus.Utils.Variant variantToCont :: Variant (a ': (b ': (c ': (d ': (e ': (f ': [])))))) -> ContFlow (a ': (b ': (c ': (d ': (e ': (f ': [])))))) r Source # variantToContM :: Monad m => m (Variant (a ': (b ': (c ': (d ': (e ': (f ': []))))))) -> ContFlow (a ': (b ': (c ': (d ': (e ': (f ': [])))))) (m r) Source # contToVariant :: ContFlow (a ': (b ': (c ': (d ': (e ': (f ': [])))))) (Variant (a ': (b ': (c ': (d ': (e ': (f ': []))))))) -> Variant (a ': (b ': (c ': (d ': (e ': (f ': [])))))) Source # contToVariantM :: Monad m => ContFlow (a ': (b ': (c ': (d ': (e ': (f ': [])))))) (m (Variant (a ': (b ': (c ': (d ': (e ': (f ': [])))))))) -> m (Variant (a ': (b ': (c ': (d ': (e ': (f ': []))))))) Source # | |
ContVariant (a ': (b ': (c ': (d ': (e ': ([] :: [*])))))) Source # | |
Defined in Haskus.Utils.Variant variantToCont :: Variant (a ': (b ': (c ': (d ': (e ': []))))) -> ContFlow (a ': (b ': (c ': (d ': (e ': []))))) r Source # variantToContM :: Monad m => m (Variant (a ': (b ': (c ': (d ': (e ': [])))))) -> ContFlow (a ': (b ': (c ': (d ': (e ': []))))) (m r) Source # contToVariant :: ContFlow (a ': (b ': (c ': (d ': (e ': []))))) (Variant (a ': (b ': (c ': (d ': (e ': [])))))) -> Variant (a ': (b ': (c ': (d ': (e ': []))))) Source # contToVariantM :: Monad m => ContFlow (a ': (b ': (c ': (d ': (e ': []))))) (m (Variant (a ': (b ': (c ': (d ': (e ': []))))))) -> m (Variant (a ': (b ': (c ': (d ': (e ': [])))))) Source # | |
ContVariant (a ': (b ': (c ': (d ': ([] :: [*]))))) Source # | |
Defined in Haskus.Utils.Variant variantToCont :: Variant (a ': (b ': (c ': (d ': [])))) -> ContFlow (a ': (b ': (c ': (d ': [])))) r Source # variantToContM :: Monad m => m (Variant (a ': (b ': (c ': (d ': []))))) -> ContFlow (a ': (b ': (c ': (d ': [])))) (m r) Source # contToVariant :: ContFlow (a ': (b ': (c ': (d ': [])))) (Variant (a ': (b ': (c ': (d ': []))))) -> Variant (a ': (b ': (c ': (d ': [])))) Source # contToVariantM :: Monad m => ContFlow (a ': (b ': (c ': (d ': [])))) (m (Variant (a ': (b ': (c ': (d ': [])))))) -> m (Variant (a ': (b ': (c ': (d ': []))))) Source # | |
ContVariant (a ': (b ': (c ': ([] :: [*])))) Source # | |
Defined in Haskus.Utils.Variant variantToCont :: Variant (a ': (b ': (c ': []))) -> ContFlow (a ': (b ': (c ': []))) r Source # variantToContM :: Monad m => m (Variant (a ': (b ': (c ': [])))) -> ContFlow (a ': (b ': (c ': []))) (m r) Source # contToVariant :: ContFlow (a ': (b ': (c ': []))) (Variant (a ': (b ': (c ': [])))) -> Variant (a ': (b ': (c ': []))) Source # contToVariantM :: Monad m => ContFlow (a ': (b ': (c ': []))) (m (Variant (a ': (b ': (c ': []))))) -> m (Variant (a ': (b ': (c ': [])))) Source # | |
ContVariant (a ': (b ': ([] :: [*]))) Source # | |
Defined in Haskus.Utils.Variant variantToCont :: Variant (a ': (b ': [])) -> ContFlow (a ': (b ': [])) r Source # variantToContM :: Monad m => m (Variant (a ': (b ': []))) -> ContFlow (a ': (b ': [])) (m r) Source # contToVariant :: ContFlow (a ': (b ': [])) (Variant (a ': (b ': []))) -> Variant (a ': (b ': [])) Source # contToVariantM :: Monad m => ContFlow (a ': (b ': [])) (m (Variant (a ': (b ': [])))) -> m (Variant (a ': (b ': []))) Source # | |
ContVariant (a ': ([] :: [*])) Source # | |
Defined in Haskus.Utils.Variant variantToCont :: Variant (a ': []) -> ContFlow (a ': []) r Source # variantToContM :: Monad m => m (Variant (a ': [])) -> ContFlow (a ': []) (m r) Source # contToVariant :: ContFlow (a ': []) (Variant (a ': [])) -> Variant (a ': []) Source # contToVariantM :: Monad m => ContFlow (a ': []) (m (Variant (a ': []))) -> m (Variant (a ': [])) Source # |
Internals
pattern V' :: forall c cs. (Member' c cs, PopVariant c cs) => c -> Variant cs Source #
Silent pattern synonym for Variant
Usage: case v of V (x :: Int) -> ... V (x :: String) -> ...
liftVariant' :: LiftVariant xs ys => Variant xs -> Variant ys Source #
fromVariant' :: forall a xs. PopVariant a xs => Variant xs -> Maybe a Source #
Try to a get a value of a given type from a Variant (silent)
popVariant' :: PopVariant a xs => Variant xs -> Either (Variant (Filter a xs)) a Source #
Remove a type from a variant
toVariant' :: forall a l. Member' a l => a -> Variant l Source #
Put a value into a Variant (silent)
Use the first matching type index.
class LiftVariant xs ys Source #
Instances
LiftVariant ([] :: [*]) ys Source # | |
Defined in Haskus.Utils.Variant liftVariant' :: Variant [] -> Variant ys Source # | |
(LiftVariant xs ys, KnownNat (IndexOf x ys)) => LiftVariant (x ': xs) ys Source # | |
Defined in Haskus.Utils.Variant liftVariant' :: Variant (x ': xs) -> Variant ys Source # |
class PopVariant a xs Source #
Instances
PopVariant a ([] :: [*]) Source # | |
Defined in Haskus.Utils.Variant | |
(PopVariant a xs', n ~ MaybeIndexOf a xs, xs' ~ RemoveAt1 n xs, Filter a xs' ~ Filter a xs, KnownNat n, xs ~ (y ': ys)) => PopVariant a (y ': ys) Source # | |
Defined in Haskus.Utils.Variant |