haskus-utils-variant-2.0.1: Variant and EADT

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 #

Apply its first argument to every element of the 2nd arg list

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. 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. (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. (MapVariant (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

class AlterVariantF (c :: (* -> *) -> Constraint) e (xs :: [* -> *]) Source #

Minimal complete definition

alterVariantF'

Instances
AlterVariantF c e ([] :: [* -> *]) Source # 
Instance details

Defined in Haskus.Utils.EADT

Methods

alterVariantF' :: (forall (f :: * -> *). c f => f e -> f e) -> Word -> Any -> Any

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

Defined in Haskus.Utils.EADT

Methods

alterVariantF' :: (forall (f :: * -> *). c f => f e -> f e) -> Word -> Any -> Any

alterVariantF :: forall c e (xs :: [* -> *]). AlterVariantF c e xs => (forall (f :: * -> *). c f => f e -> f e) -> VariantF xs e -> VariantF xs e Source #

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

Usage:

  alterVariantF @NoConstraint id         v
  alterVariantF @Resizable    (resize 4) v

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

class AlgVariantF (c :: (* -> *) -> Constraint) e (xs :: [* -> *]) Source #

Minimal complete definition

algVariantF'

Instances
AlgVariantF c e ([] :: [* -> *]) Source # 
Instance details

Defined in Haskus.Utils.EADT

Methods

algVariantF' :: (forall (f :: * -> *). c f => f e -> e) -> Word -> Any -> e

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

Defined in Haskus.Utils.EADT

Methods

algVariantF' :: (forall (f :: * -> *). c f => f e -> e) -> Word -> Any -> e

algVariantF :: forall c e (xs :: [* -> *]). AlgVariantF c e xs => (forall (f :: * -> *). c f => f e -> e) -> VariantF xs e -> e Source #

Apply an algebra to a VariantF. You need to specify the constraints required by the modifying function.

Usage:

 algVariantF @NoConstraint id         v
 algVariantF @Resizable    (resize 4) v

splitVariantF :: forall as xs e. (Complement (ApplyAll e xs) (ApplyAll e as) ~ ApplyAll e (Complement xs as), SplitVariant (ApplyAll e as) (ApplyAll e xs) (ApplyAll e xs)) => VariantF xs e -> Either (VariantF as e) (VariantF (Complement xs as) e) Source #

Split a VariantF in two

variantFToCont :: ContVariant (ApplyAll e xs) => VariantF xs e -> ContFlow (ApplyAll e xs) r Source #

Convert a VariantF into a multi-continuation

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

Convert a VariantF into a multi-continuation

contToVariantF :: forall xs e. ContVariant (ApplyAll e xs) => ContFlow (ApplyAll e xs) (V (ApplyAll e xs)) -> VariantF xs e Source #

Convert a multi-continuation into a VariantF

contToVariantFM :: forall xs e m. (ContVariant (ApplyAll e xs), Monad m) => ContFlow (ApplyAll e xs) (m (V (ApplyAll e xs))) -> m (VariantF xs e) Source #

Convert a multi-continuation into a VariantF

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, 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

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

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