haskus-utils-variant-2.4: Variant and EADT

Safe HaskellNone
LanguageHaskell2010

Haskus.Utils.VariantF

Contents

Description

VariantF functor

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.VariantF

Methods

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

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

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

Defined in Haskus.Utils.VariantF

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.VariantF

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.VariantF

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.VariantF

Methods

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

show :: VariantF xs e -> String #

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

ContVariant (ApplyAll e xs) => MultiCont (VariantF xs e) Source # 
Instance details

Defined in Haskus.Utils.VariantF

Associated Types

type MultiContTypes (VariantF xs e) :: [Type] Source #

Methods

toCont :: VariantF xs e -> ContFlow (MultiContTypes (VariantF xs e)) r Source #

toContM :: Monad m => m (VariantF xs e) -> ContFlow (MultiContTypes (VariantF xs e)) (m r) Source #

type MultiContTypes (VariantF xs e) Source # 
Instance details

Defined in Haskus.Utils.VariantF

type MultiContTypes (VariantF xs e) = ApplyAll e xs

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

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

Retrieve a single value

type MapVariantF a b cs ds e = (MapVariant (a e) (b e) (ApplyAll e cs), ds ~ ReplaceNS (IndexesOf a cs) b cs, ApplyAll e ds ~ ReplaceNS (IndexesOf (a e) (ApplyAll e cs)) (b e) (ApplyAll e cs)) Source #

mapVariantF :: forall a b cs ds e. MapVariantF a b cs ds e => (a e -> b e) -> VariantF cs e -> VariantF ds e Source #

Map the matching types of a variant

type PopVariantF x xs e = (x e :< ApplyAll e xs, Remove (x e) (ApplyAll e xs) ~ ApplyAll e (Remove x xs)) Source #

popVariantF :: forall x xs e. PopVariantF x xs e => VariantF xs e -> Either (VariantF (Remove x xs) e) (x e) Source #

Pop VariantF

type LiftVariantF xs ys e = LiftVariant (ApplyAll e xs) (ApplyAll e ys) Source #

xs is liftable in ys

liftVariantF :: forall as bs e. LiftVariantF as bs e => 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 ([] :: [Type -> Type]) Source # 
Instance details

Defined in Haskus.Utils.VariantF

Methods

alterVariantF' :: (forall (f :: Type -> Type). 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.VariantF

Methods

alterVariantF' :: (forall (f :: Type -> Type). 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 ([] :: [Type -> Type]) Source # 
Instance details

Defined in Haskus.Utils.VariantF

Methods

algVariantF' :: (forall (f :: Type -> Type). 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.VariantF

Methods

algVariantF' :: (forall (f :: Type -> Type). 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

type SplitVariantF as xs e = (Complement (ApplyAll e xs) (ApplyAll e as) ~ ApplyAll e (Complement xs as), SplitVariant (ApplyAll e as) (ApplyAll e (Complement xs as)) (ApplyAll e xs)) Source #

splitVariantF :: forall as xs e. SplitVariantF as xs e => VariantF xs e -> Either (VariantF (Complement xs as) e) (VariantF 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

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