haskus-utils-variant-1.0: Haskus utility modules

Safe HaskellNone
LanguageHaskell2010

Haskus.Utils.EADT

Contents

Description

Extensible ADT

Synopsis

Documentation

newtype VariantF (xs :: [* -> *]) e Source #

Recursive Functor-like Variant

Constructors

VariantF (V (ApplyAll e xs)) 
Instances
(Functor (VariantF fs), Functor f) => Functor (VariantF (f ': fs)) Source # 
Instance details

Defined in Haskus.Utils.EADT

Methods

fmap :: (a -> b) -> VariantF (f ': fs) a -> VariantF (f ': fs) b #

(<$) :: a -> VariantF (f ': fs) b -> VariantF (f ': fs) a #

Functor (VariantF ([] :: [* -> *])) Source # 
Instance details

Defined in Haskus.Utils.EADT

Methods

fmap :: (a -> b) -> VariantF [] a -> VariantF [] b #

(<$) :: a -> VariantF [] b -> VariantF [] a #

Eq (V (ApplyAll e xs)) => Eq (VariantF xs e) Source # 
Instance details

Defined in Haskus.Utils.EADT

Methods

(==) :: VariantF xs e -> VariantF xs e -> Bool #

(/=) :: VariantF xs e -> VariantF xs e -> Bool #

Ord (V (ApplyAll e xs)) => Ord (VariantF xs e) Source # 
Instance details

Defined in Haskus.Utils.EADT

Methods

compare :: VariantF xs e -> VariantF xs e -> Ordering #

(<) :: VariantF xs e -> VariantF xs e -> Bool #

(<=) :: VariantF xs e -> VariantF xs e -> Bool #

(>) :: VariantF xs e -> VariantF xs e -> Bool #

(>=) :: VariantF xs e -> VariantF xs e -> Bool #

max :: VariantF xs e -> VariantF xs e -> VariantF xs e #

min :: VariantF xs e -> VariantF xs e -> VariantF xs e #

Show (V (ApplyAll e xs)) => Show (VariantF xs e) Source # 
Instance details

Defined in Haskus.Utils.EADT

Methods

showsPrec :: Int -> VariantF xs e -> ShowS #

show :: VariantF xs e -> String #

showList :: [VariantF xs e] -> ShowS #

type family ApplyAll e (xs :: [* -> *]) :: [*] where ... Source #

`ApplyAll e '[f,g,h] ==> '[f e, g e, h e]`

Equations

ApplyAll e '[] = '[] 
ApplyAll e (f ': fs) = f e ': ApplyAll e fs 

pattern FV :: forall c cs e. Popable c (ApplyAll e cs) => c -> VariantF cs e Source #

Pattern-match in a VariantF

appendVariantF :: forall (ys :: [* -> *]) (xs :: [* -> *]) e. ApplyAll e (Concat xs ys) ~ Concat (ApplyAll e xs) (ApplyAll e ys) => VariantF xs e -> VariantF (Concat xs ys) e Source #

toVariantFHead :: forall x xs e. x e -> VariantF (x ': xs) e Source #

Set the first value

toVariantFTail :: forall x xs e. VariantF xs e -> VariantF (x ': xs) e Source #

Set the tail

popVariantFHead :: forall x xs e. VariantF (x ': xs) e -> Either (VariantF xs e) (x e) Source #

Pop VariantF head

popVariantF :: forall x xs ys e. (Popable (x e) (ApplyAll e xs), Filter (x e) (ApplyAll e xs) ~ ApplyAll e ys) => VariantF xs e -> Either (VariantF ys e) (x e) Source #

Pop VariantF

mapVariantF :: forall a b cs e ds as. (MappableVariant (a e) (b e) as, ds ~ ReplaceNS (IndexesOf a cs) b cs, as ~ ApplyAll e cs, ApplyAll e ds ~ ReplaceNS (IndexesOf (a e) as) (b e) as) => (a e -> b e) -> VariantF cs e -> VariantF ds e Source #

Map the matching types of a variant

variantFToValue :: VariantF '[f] e -> f e Source #

Retrieve a single value

type LiftableF e xs ys = (IsSubset xs ys ~ True, LiftVariant (ApplyAll e xs) (ApplyAll e ys)) Source #

xs is liftable in ys

liftVariantF :: forall e as bs. LiftableF e as bs => VariantF as e -> VariantF bs e Source #

Lift a VariantF into another

Extensible ADT

type EADT xs = Fix (VariantF xs) Source #

An extensible ADT

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

Equations

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

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), LiftableF e as bs, Functor (VariantF as)) => EADT as -> EADT bs Source #

Lift an EADT into another

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

Pop an EADT value

Reexport