haskus-utils-variant-2.0.1: Variant and EADT

Safe HaskellNone
LanguageHaskell2010

Haskus.Utils.Variant

Contents

Description

Open sum type

Synopsis

Documentation

data V (l :: [*]) Source #

A variant contains a value whose type is at the given position in the type list

Constructors

Variant !Word Any 
Instances
(Eq (V xs), Eq x) => Eq (V (x ': xs)) Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

(==) :: V (x ': xs) -> V (x ': xs) -> Bool #

(/=) :: V (x ': xs) -> V (x ': xs) -> Bool #

Eq (V ([] :: [*])) Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

(==) :: V [] -> V [] -> Bool #

(/=) :: V [] -> V [] -> Bool #

(Ord (V xs), Ord x) => Ord (V (x ': xs)) Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

compare :: V (x ': xs) -> V (x ': xs) -> Ordering #

(<) :: V (x ': xs) -> V (x ': xs) -> Bool #

(<=) :: V (x ': xs) -> V (x ': xs) -> Bool #

(>) :: V (x ': xs) -> V (x ': xs) -> Bool #

(>=) :: V (x ': xs) -> V (x ': xs) -> Bool #

max :: V (x ': xs) -> V (x ': xs) -> V (x ': xs) #

min :: V (x ': xs) -> V (x ': xs) -> V (x ': xs) #

Ord (V ([] :: [*])) Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

compare :: V [] -> V [] -> Ordering #

(<) :: V [] -> V [] -> Bool #

(<=) :: V [] -> V [] -> Bool #

(>) :: V [] -> V [] -> Bool #

(>=) :: V [] -> V [] -> Bool #

max :: V [] -> V [] -> V [] #

min :: V [] -> V [] -> V [] #

(Show (V xs), Show x, Typeable x) => Show (V (x ': xs)) Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

showsPrec :: Int -> V (x ': xs) -> ShowS #

show :: V (x ': xs) -> String #

showList :: [V (x ': xs)] -> ShowS #

Show (V ([] :: [*])) Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

showsPrec :: Int -> V [] -> ShowS #

show :: V [] -> String #

showList :: [V []] -> ShowS #

Flattenable (V ([] :: [*])) rs Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

toFlattenVariant :: Word -> V [] -> rs

(Flattenable (V ys) (V rs), KnownNat (Length xs)) => Flattenable (V (V xs ': ys)) (V rs) Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

toFlattenVariant :: Word -> V (V xs ': ys) -> V rs

variantIndex :: V a -> Word Source #

Get Variant index

Patterns

pattern V :: forall c cs. c :< cs => c -> V cs Source #

Pattern synonym for Variant

Usage: case v of V (x :: Int) -> ... V (x :: String) -> ...

pattern VMaybe :: forall c cs. c :<? cs => c -> V cs Source #

Statically unchecked matching on a Variant

type (:<) x xs = (Member x xs, x :<? xs) Source #

A value of type "x" can be extracted from (V xs)

type (:<?) x xs = PopVariant x xs Source #

A value of type "x" **might** be extracted from (V xs). We don't check that "x" is in "xs".

Operations by index

toVariantAt :: forall (n :: Nat) (l :: [*]). KnownNat n => Index n l -> V l Source #

Set the value with the given indexed type

toVariantHead :: forall x xs. x -> V (x ': xs) Source #

Set the first value

toVariantTail :: forall x xs. V xs -> V (x ': xs) Source #

Set the tail

fromVariantAt :: forall (n :: Nat) (l :: [*]). KnownNat n => V l -> Maybe (Index n l) Source #

Get the value if it has the indexed type

popVariantAt :: forall (n :: Nat) l. KnownNat n => V l -> Either (V (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. V (x ': xs) -> Either (V xs) x Source #

Pop the head of a variant value

mapVariantAt :: forall (n :: Nat) a b l. (KnownNat n, a ~ Index n l) => (a -> b) -> V l -> V (ReplaceN n b l) Source #

Update a single variant value by index

mapVariantAtM :: forall (n :: Nat) a b l m. (KnownNat n, Applicative m, a ~ Index n l) => (a -> m b) -> V l -> m (V (ReplaceN n b l)) Source #

Applicative update of a single variant value by index

foldMapVariantAt :: forall (n :: Nat) l l2. (KnownNat n, KnownNat (Length l2)) => (Index n l -> V l2) -> V l -> V (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 (V l2)) -> V l -> m (V (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 -> V 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 family Filter (a :: k) (l :: [k]) :: [k] where ... #

Remove a in l

Equations

Filter (a :: k) ([] :: [k]) = ([] :: [k]) 
Filter (a :: k) (a ': as :: [k]) = Filter a as 
Filter (a :: k) (b ': as :: [k]) = b ': Filter a as 

popVariant :: forall a xs. a :< xs => V xs -> Either (V (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. a :<? xs => V xs -> Either (V (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. a :< xs => V xs -> Maybe a Source #

Try to a get a value of a given type from a Variant

fromVariantMaybe :: forall a xs. a :<? xs => V 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 => V l -> Maybe a Source #

Pick the first matching type of a Variant

fromVariantFirst @A (Variant 2 undefined :: V '[A,B,A]) == Nothing

mapVariantFirst :: forall a b n l. (Member a l, n ~ IndexOf a l) => (a -> b) -> V l -> V (ReplaceN n b l) Source #

Update of the first matching variant value

mapVariantFirstM :: forall a b n l m. (Member a l, n ~ IndexOf a l, Applicative m) => (a -> m b) -> V l -> m (V (ReplaceN n b l)) Source #

Applicative update of the first matching variant value

type ReplaceAll a b cs = ReplaceNS (IndexesOf a cs) b cs Source #

type MapVariant a b cs = MapVariantIndexes a b cs (IndexesOf a cs) Source #

mapVariant :: forall a b cs. MapVariant a b cs => (a -> b) -> V cs -> V (ReplaceAll a b cs) Source #

Map the matching types of a variant

mapNubVariant :: forall a b cs ds rs. (MapVariant a b cs, ds ~ ReplaceNS (IndexesOf a cs) b cs, rs ~ Nub ds, Liftable ds rs) => (a -> b) -> V cs -> V rs Source #

Map the matching types of a variant and nub the result

foldMapVariantFirst :: forall a (n :: Nat) l l2. (KnownNat n, KnownNat (Length l2), n ~ IndexOf a l, a ~ Index n l) => (a -> V l2) -> V l -> V (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, 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 NoConstraint a Source #

Useful to specify a "* -> Constraint" function returning an empty constraint

Instances
NoConstraint a Source # 
Instance details

Defined in Haskus.Utils.Variant

class AlterVariant c (b :: [*]) Source #

Minimal complete definition

alterVariant'

Instances
AlterVariant c ([] :: [*]) Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

alterVariant' :: (forall a. c a => a -> a) -> Word -> Any -> Any

(AlterVariant c xs, c x) => AlterVariant c (x ': xs) Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

alterVariant' :: (forall a. c a => a -> a) -> Word -> Any -> Any

alterVariant :: forall c (a :: [*]). AlterVariant c a => (forall x. c x => x -> x) -> V a -> V 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

  • - Multiple constraints: class (Ord a, Num a) => OrdNum a instance (Ord a, Num a) => OrdNum a alterVariant @OrdNum foo v

class TraverseVariant c (b :: [*]) m Source #

Minimal complete definition

traverseVariant'

Instances
TraverseVariant c ([] :: [*]) m Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

traverseVariant' :: (forall a. (Monad m, c a) => a -> m a) -> Word -> Any -> m Any

(TraverseVariant c xs m, c x, Monad m) => TraverseVariant c (x ': xs) m Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

traverseVariant' :: (forall a. (Monad m, c a) => a -> m a) -> Word -> Any -> m Any

traverseVariant :: forall c (a :: [*]) m. (TraverseVariant c a m, Monad m) => (forall x. c x => x -> m x) -> V a -> m (V 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 ()) -> V a -> m () Source #

Traverse a variant. You need to specify the constraints required by the modifying function.

class ReduceVariant c r (b :: [*]) Source #

Minimal complete definition

reduceVariant'

Instances
ReduceVariant c r ([] :: [*]) Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

reduceVariant' :: (forall a. c a => a -> r) -> Word -> Any -> r

(ReduceVariant c r xs, c x) => ReduceVariant c r (x ': xs) Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

reduceVariant' :: (forall a. c a => a -> r) -> Word -> Any -> r

reduceVariant :: forall c r (a :: [*]). ReduceVariant c r a => (forall x. c x => x -> r) -> V a -> r Source #

Reduce a variant to a single value by using a class function. You need to specify the constraints required by the modifying function.

Usage: reduceVariant @Show show v

Conversions between variants

appendVariant :: forall (ys :: [*]) (xs :: [*]). V xs -> V (Concat xs ys) Source #

Extend a variant by appending other possible values

prependVariant :: forall (ys :: [*]) (xs :: [*]). KnownNat (Length ys) => V xs -> V (Concat ys xs) Source #

Extend a variant by prepending other possible values

type Liftable xs ys = (IsSubset xs ys ~ True, LiftVariant xs ys) Source #

xs is liftable in ys

liftVariant :: forall ys xs. Liftable xs ys => V xs -> V ys Source #

Lift a variant into another

Set values to the first matching type

nubVariant :: Liftable xs (Nub xs) => V xs -> V (Nub xs) Source #

Nub the type list

productVariant :: forall xs ys. KnownNat (Length ys) => V xs -> V ys -> V (Product xs ys) Source #

Product of two variants

class Flattenable a rs Source #

Minimal complete definition

toFlattenVariant

Instances
Flattenable (V ([] :: [*])) rs Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

toFlattenVariant :: Word -> V [] -> rs

(Flattenable (V ys) (V rs), KnownNat (Length xs)) => Flattenable (V (V xs ': ys)) (V rs) Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

toFlattenVariant :: Word -> V (V xs ': ys) -> V rs

type family FlattenVariant (xs :: [*]) :: [*] where ... Source #

Equations

FlattenVariant '[] = '[] 
FlattenVariant (V xs ': ys) = Concat xs (FlattenVariant ys) 
FlattenVariant (y ': ys) = y ': FlattenVariant ys 

flattenVariant :: forall xs. Flattenable (V xs) (V (FlattenVariant xs)) => V xs -> V (FlattenVariant xs) Source #

Flatten variants in a variant

type family ExtractM m f where ... Source #

Equations

ExtractM m '[] = '[] 
ExtractM m (m x ': xs) = x ': ExtractM m xs 

joinVariant :: JoinVariant m xs => V xs -> m (V (ExtractM m xs)) Source #

Join on a variant

Transform a variant of applicatives as follow: f :: V '[m a, m b, m c] -> m (V '[a,b,c]) f = joinVariant @m

joinVariantUnsafe :: forall m xs ys. (Functor m, ys ~ ExtractM m xs) => V xs -> m (V ys) Source #

Join on a variant in an unsafe way.

Works with IO for example but not with Maybe.

class JoinVariant m xs Source #

Minimal complete definition

joinVariant

Instances
JoinVariant m ([] :: [*]) Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

joinVariant :: V [] -> m (V (ExtractM m [])) Source #

(Functor m, ExtractM m (m a ': xs) ~ (a ': ExtractM m xs), JoinVariant m xs) => JoinVariant m (m a ': xs) Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

joinVariant :: V (m a ': xs) -> m (V (ExtractM m (m a ': xs))) Source #

splitVariant :: forall as xs. SplitVariant as xs xs => V xs -> Either (V as) (V (Complement xs as)) Source #

Split a variant in two

class SplitVariant as rs xs Source #

Minimal complete definition

splitVariant'

Instances
SplitVariant as rs ([] :: [*]) Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

splitVariant' :: V [] -> Either (V as) (V (Complement rs as))

(n ~ MaybeIndexOf x as, m ~ IndexOf x rs, SplitVariant as rs xs, KnownNat m, KnownNat n) => SplitVariant as rs (x ': xs) Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

splitVariant' :: V (x ': xs) -> Either (V as) (V (Complement rs as))

Conversions to/from other data types

variantToValue :: V '[a] -> a Source #

Retrieve a single value

variantFromValue :: a -> V '[a] Source #

Create a variant from a single value

variantToEither :: forall a b. V '[a, b] -> Either b a Source #

Convert a variant of two values in a Either

variantFromEither :: Either a b -> V '[b, a] Source #

Lift an Either into a Variant (reversed order by convention)

variantToHList :: VariantToHList xs => V 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) => V l -> t Source #

Get variant possible values in a tuple of Maybe types

Continuations

class ContVariant xs where Source #

Methods

variantToCont :: V xs -> ContFlow xs r Source #

Convert a variant into a multi-continuation

variantToContM :: Monad m => m (V xs) -> ContFlow xs (m r) Source #

Convert a variant into a multi-continuation

contToVariant :: ContFlow xs (V xs) -> V xs Source #

Convert a multi-continuation into a Variant

contToVariantM :: Monad m => ContFlow xs (m (V xs)) -> m (V xs) Source #

Convert a multi-continuation into a Variant

Instances
ContVariant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': (k ': (l ': ([] :: [*]))))))))))))) Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

variantToCont :: V (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 (V (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 ': [])))))))))))) (V (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': (k ': (l ': []))))))))))))) -> V (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 (V (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': (k ': (l ': [])))))))))))))) -> m (V (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 # 
Instance details

Defined in Haskus.Utils.Variant

Methods

variantToCont :: V (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 (V (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 ': []))))))))))) (V (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': (k ': [])))))))))))) -> V (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 (V (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': (k ': []))))))))))))) -> m (V (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': (k ': [])))))))))))) Source #

ContVariant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': ([] :: [*]))))))))))) Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

variantToCont :: V (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 (V (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 ': [])))))))))) (V (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': []))))))))))) -> V (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 (V (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': [])))))))))))) -> m (V (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': (j ': []))))))))))) Source #

ContVariant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': ([] :: [*])))))))))) Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

variantToCont :: V (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 (V (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 ': []))))))))) (V (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': [])))))))))) -> V (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': []))))))))) Source #

contToVariantM :: Monad m => ContFlow (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': []))))))))) (m (V (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': []))))))))))) -> m (V (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': (i ': [])))))))))) Source #

ContVariant (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': ([] :: [*]))))))))) Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

variantToCont :: V (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': [])))))))) -> ContFlow (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': [])))))))) r Source #

variantToContM :: Monad m => m (V (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 ': [])))))))) (V (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': []))))))))) -> V (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': [])))))))) Source #

contToVariantM :: Monad m => ContFlow (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': [])))))))) (m (V (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': [])))))))))) -> m (V (a ': (b ': (c ': (d ': (e ': (f ': (g ': (h ': []))))))))) Source #

ContVariant (a ': (b ': (c ': (d ': (e ': (f ': (g ': ([] :: [*])))))))) Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

variantToCont :: V (a ': (b ': (c ': (d ': (e ': (f ': (g ': []))))))) -> ContFlow (a ': (b ': (c ': (d ': (e ': (f ': (g ': []))))))) r Source #

variantToContM :: Monad m => m (V (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 ': []))))))) (V (a ': (b ': (c ': (d ': (e ': (f ': (g ': [])))))))) -> V (a ': (b ': (c ': (d ': (e ': (f ': (g ': []))))))) Source #

contToVariantM :: Monad m => ContFlow (a ': (b ': (c ': (d ': (e ': (f ': (g ': []))))))) (m (V (a ': (b ': (c ': (d ': (e ': (f ': (g ': []))))))))) -> m (V (a ': (b ': (c ': (d ': (e ': (f ': (g ': [])))))))) Source #

ContVariant (a ': (b ': (c ': (d ': (e ': (f ': ([] :: [*]))))))) Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

variantToCont :: V (a ': (b ': (c ': (d ': (e ': (f ': [])))))) -> ContFlow (a ': (b ': (c ': (d ': (e ': (f ': [])))))) r Source #

variantToContM :: Monad m => m (V (a ': (b ': (c ': (d ': (e ': (f ': []))))))) -> ContFlow (a ': (b ': (c ': (d ': (e ': (f ': [])))))) (m r) Source #

contToVariant :: ContFlow (a ': (b ': (c ': (d ': (e ': (f ': [])))))) (V (a ': (b ': (c ': (d ': (e ': (f ': []))))))) -> V (a ': (b ': (c ': (d ': (e ': (f ': [])))))) Source #

contToVariantM :: Monad m => ContFlow (a ': (b ': (c ': (d ': (e ': (f ': [])))))) (m (V (a ': (b ': (c ': (d ': (e ': (f ': [])))))))) -> m (V (a ': (b ': (c ': (d ': (e ': (f ': []))))))) Source #

ContVariant (a ': (b ': (c ': (d ': (e ': ([] :: [*])))))) Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

variantToCont :: V (a ': (b ': (c ': (d ': (e ': []))))) -> ContFlow (a ': (b ': (c ': (d ': (e ': []))))) r Source #

variantToContM :: Monad m => m (V (a ': (b ': (c ': (d ': (e ': [])))))) -> ContFlow (a ': (b ': (c ': (d ': (e ': []))))) (m r) Source #

contToVariant :: ContFlow (a ': (b ': (c ': (d ': (e ': []))))) (V (a ': (b ': (c ': (d ': (e ': [])))))) -> V (a ': (b ': (c ': (d ': (e ': []))))) Source #

contToVariantM :: Monad m => ContFlow (a ': (b ': (c ': (d ': (e ': []))))) (m (V (a ': (b ': (c ': (d ': (e ': []))))))) -> m (V (a ': (b ': (c ': (d ': (e ': [])))))) Source #

ContVariant (a ': (b ': (c ': (d ': ([] :: [*]))))) Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

variantToCont :: V (a ': (b ': (c ': (d ': [])))) -> ContFlow (a ': (b ': (c ': (d ': [])))) r Source #

variantToContM :: Monad m => m (V (a ': (b ': (c ': (d ': []))))) -> ContFlow (a ': (b ': (c ': (d ': [])))) (m r) Source #

contToVariant :: ContFlow (a ': (b ': (c ': (d ': [])))) (V (a ': (b ': (c ': (d ': []))))) -> V (a ': (b ': (c ': (d ': [])))) Source #

contToVariantM :: Monad m => ContFlow (a ': (b ': (c ': (d ': [])))) (m (V (a ': (b ': (c ': (d ': [])))))) -> m (V (a ': (b ': (c ': (d ': []))))) Source #

ContVariant (a ': (b ': (c ': ([] :: [*])))) Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

variantToCont :: V (a ': (b ': (c ': []))) -> ContFlow (a ': (b ': (c ': []))) r Source #

variantToContM :: Monad m => m (V (a ': (b ': (c ': [])))) -> ContFlow (a ': (b ': (c ': []))) (m r) Source #

contToVariant :: ContFlow (a ': (b ': (c ': []))) (V (a ': (b ': (c ': [])))) -> V (a ': (b ': (c ': []))) Source #

contToVariantM :: Monad m => ContFlow (a ': (b ': (c ': []))) (m (V (a ': (b ': (c ': []))))) -> m (V (a ': (b ': (c ': [])))) Source #

ContVariant (a ': (b ': ([] :: [*]))) Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

variantToCont :: V (a ': (b ': [])) -> ContFlow (a ': (b ': [])) r Source #

variantToContM :: Monad m => m (V (a ': (b ': []))) -> ContFlow (a ': (b ': [])) (m r) Source #

contToVariant :: ContFlow (a ': (b ': [])) (V (a ': (b ': []))) -> V (a ': (b ': [])) Source #

contToVariantM :: Monad m => ContFlow (a ': (b ': [])) (m (V (a ': (b ': [])))) -> m (V (a ': (b ': []))) Source #

ContVariant (a ': ([] :: [*])) Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

variantToCont :: V (a ': []) -> ContFlow (a ': []) r Source #

variantToContM :: Monad m => m (V (a ': [])) -> ContFlow (a ': []) (m r) Source #

contToVariant :: ContFlow (a ': []) (V (a ': [])) -> V (a ': []) Source #

contToVariantM :: Monad m => ContFlow (a ': []) (m (V (a ': []))) -> m (V (a ': [])) Source #

Internals

pattern VSilent :: forall c cs. (Member' c cs, PopVariant c cs) => c -> V cs Source #

Silent pattern synonym for Variant

Usage: case v of VSilent (x :: Int) -> ... VSilent (x :: String) -> ...

liftVariant' :: LiftVariant xs ys => V xs -> V ys Source #

fromVariant' :: forall a xs. PopVariant a xs => V xs -> Maybe a Source #

Try to a get a value of a given type from a Variant (silent)

popVariant' :: PopVariant a xs => V xs -> Either (V (Filter a xs)) a Source #

Remove a type from a variant

toVariant' :: forall a l. Member' a l => a -> V l Source #

Put a value into a Variant (silent)

Use the first matching type index.

class LiftVariant xs ys Source #

Minimal complete definition

liftVariant'

Instances
LiftVariant ([] :: [*]) ys Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

liftVariant' :: V [] -> V ys Source #

(LiftVariant xs ys, KnownNat (IndexOf x ys)) => LiftVariant (x ': xs) ys Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

liftVariant' :: V (x ': xs) -> V ys Source #

class PopVariant a xs Source #

Minimal complete definition

popVariant'

Instances
PopVariant a ([] :: [*]) Source # 
Instance details

Defined in Haskus.Utils.Variant

Methods

popVariant' :: V [] -> Either (V (Filter a [])) a Source #

(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 # 
Instance details

Defined in Haskus.Utils.Variant

Methods

popVariant' :: V (y ': ys) -> Either (V (Filter a (y ': ys))) a Source #