haskus-utils-variant-2.4: Variant and EADT

Safe HaskellNone
LanguageHaskell2010

Haskus.Utils.EADT

Contents

Description

Extensible ADT

Synopsis

Documentation

type EADT xs = Fix (VariantF xs) Source #

An extensible ADT

type family f :<: xs where ... Source #

Constructor f is in xs

Equations

f :<: xs = EADTF' f (EADT xs) xs 

type family xs :<<: ys :: Constraint where ... Source #

Forall x in xs, `x :<: ys`

Equations

'[] :<<: ys = () 
(x ': xs) :<<: ys = (x :<: ys, xs :<<: ys) 

pattern VF :: forall e f cs. (e ~ EADT cs, f :<: cs) => f (EADT cs) -> EADT cs Source #

Pattern-match in an extensible ADT

appendEADT :: forall ys xs zs. (zs ~ Concat xs ys, ApplyAll (EADT zs) zs ~ Concat (ApplyAll (EADT zs) xs) (ApplyAll (EADT zs) ys), Functor (VariantF xs)) => EADT xs -> EADT zs Source #

Append new "constructors" to the EADT

liftEADT :: forall e as bs. (e ~ Fix (VariantF bs), LiftVariantF as bs e, Functor (VariantF as)) => EADT as -> EADT bs Source #

Lift an EADT into another

popEADT :: forall f xs e. (f :<: xs, e ~ EADT xs, f e :< ApplyAll e xs) => EADT xs -> Either (VariantF (Remove f xs) (EADT xs)) (f (EADT xs)) Source #

Pop an EADT value

type AlterEADT c xs = AlterVariantF c (EADT xs) xs Source #

alterEADT :: forall c xs. AlterEADT c xs => (forall f. c f => f (EADT xs) -> f (EADT xs)) -> EADT xs -> EADT xs Source #

Alter an EADT value

type AlgEADT c xs = AlgVariantF c (EADT xs) xs Source #

algEADT :: forall c xs. AlgEADT c xs => (forall f. c f => f (EADT xs) -> EADT xs) -> EADT xs -> EADT xs Source #

Apply an algebra to an EADT value

eadtToCont :: ContVariant (ApplyAll (Fix (VariantF xs)) xs) => Fix (VariantF xs) -> ContFlow (ApplyAll (Fix (VariantF xs)) xs) r Source #

Convert an EADT into a multi-continuation

eadtToContM :: (ContVariant (ApplyAll (Fix (VariantF xs)) xs), Monad m) => m (Fix (VariantF xs)) -> ContFlow (ApplyAll (Fix (VariantF xs)) xs) (m r) Source #

Convert an EADT into a multi-continuation

contToEADT :: ContVariant (ApplyAll (Fix (VariantF xs)) xs) => ContFlow (ApplyAll (Fix (VariantF xs)) xs) (V (ApplyAll (Fix (VariantF xs)) xs)) -> Fix (VariantF xs) Source #

Convert a multi-continuation into an EADT

contToEADTM :: (ContVariant (ApplyAll (Fix (VariantF xs)) xs), Monad f) => ContFlow (ApplyAll (Fix (VariantF xs)) xs) (f (V (ApplyAll (Fix (VariantF xs)) xs))) -> f (Fix (VariantF xs)) Source #

Convert a multi-continuation into an EADT

Reexport