Safe Haskell | None |
---|---|
Language | Haskell2010 |
Extensible ADT
Synopsis
- newtype VariantF (xs :: [* -> *]) e = VariantF (V (ApplyAll e xs))
- type family ApplyAll e (xs :: [* -> *]) :: [*] where ...
- pattern FV :: forall c cs e. c :< ApplyAll e cs => c -> VariantF cs e
- 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
- toVariantFHead :: forall x xs e. x e -> VariantF (x ': xs) e
- toVariantFTail :: forall x xs e. VariantF xs e -> VariantF (x ': xs) e
- popVariantFHead :: forall x xs e. VariantF (x ': xs) e -> Either (VariantF xs e) (x e)
- 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)
- 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
- variantFToValue :: VariantF '[f] e -> f e
- type LiftableF e xs ys = (IsSubset xs ys ~ True, LiftVariant (ApplyAll e xs) (ApplyAll e ys))
- liftVariantF :: forall e as bs. LiftableF e as bs => VariantF as e -> VariantF bs e
- class AlterVariantF (c :: (* -> *) -> Constraint) e (xs :: [* -> *])
- alterVariantF :: forall c e (xs :: [* -> *]). AlterVariantF c e xs => (forall (f :: * -> *). c f => f e -> f e) -> VariantF xs e -> VariantF xs e
- class AlgVariantF (c :: (* -> *) -> Constraint) e (xs :: [* -> *])
- algVariantF :: forall c e (xs :: [* -> *]). AlgVariantF c e xs => (forall (f :: * -> *). c f => f e -> e) -> VariantF xs e -> e
- 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)
- variantFToCont :: ContVariant (ApplyAll e xs) => VariantF xs e -> ContFlow (ApplyAll e xs) r
- variantFToContM :: (ContVariant (ApplyAll e xs), Monad m) => m (VariantF xs e) -> ContFlow (ApplyAll e xs) (m r)
- contToVariantF :: forall xs e. ContVariant (ApplyAll e xs) => ContFlow (ApplyAll e xs) (V (ApplyAll e xs)) -> VariantF xs e
- contToVariantFM :: forall xs e m. (ContVariant (ApplyAll e xs), Monad m) => ContFlow (ApplyAll e xs) (m (V (ApplyAll e xs))) -> m (VariantF xs e)
- type EADT xs = Fix (VariantF xs)
- type family f :<: xs where ...
- pattern VF :: forall e f cs. (e ~ EADT cs, f :<: cs) => f (EADT cs) -> EADT cs
- 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
- liftEADT :: forall e as bs. (e ~ Fix (VariantF bs), LiftableF e as bs, Functor (VariantF as)) => EADT as -> EADT bs
- 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))
- type AlterEADT c xs = AlterVariantF c (EADT xs) xs
- alterEADT :: forall c xs. AlterEADT c xs => (forall f. c f => f (EADT xs) -> f (EADT xs)) -> EADT xs -> EADT xs
- type AlgEADT c xs = AlgVariantF c (EADT xs) xs
- algEADT :: forall c xs. AlgEADT c xs => (forall f. c f => f (EADT xs) -> EADT xs) -> EADT xs -> EADT xs
- eadtToCont :: ContVariant (ApplyAll (Fix (VariantF xs)) xs) => Fix (VariantF xs) -> ContFlow (ApplyAll (Fix (VariantF xs)) xs) r
- eadtToContM :: (ContVariant (ApplyAll (Fix (VariantF xs)) xs), Monad m) => m (Fix (VariantF xs)) -> ContFlow (ApplyAll (Fix (VariantF xs)) xs) (m r)
- contToEADT :: ContVariant (ApplyAll (Fix (VariantF xs)) xs) => ContFlow (ApplyAll (Fix (VariantF xs)) xs) (V (ApplyAll (Fix (VariantF xs)) xs)) -> Fix (VariantF xs)
- 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))
- class NoConstraint a
- module Haskus.Utils.Functor
Documentation
newtype VariantF (xs :: [* -> *]) e Source #
Recursive Functor-like Variant
Instances
(Functor (VariantF fs), Functor f) => Functor (VariantF (f ': fs)) Source # | |
Functor (VariantF ([] :: [* -> *])) Source # | |
Eq (V (ApplyAll e xs)) => Eq (VariantF xs e) Source # | |
Ord (V (ApplyAll e xs)) => Ord (VariantF xs e) Source # | |
Defined in Haskus.Utils.EADT 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 # | |
Show (V (ApplyAll e xs)) => Show (VariantF xs e) Source # | |
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]
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 #
alterVariantF'
Instances
AlterVariantF c e ([] :: [* -> *]) Source # | |
Defined in Haskus.Utils.EADT | |
(AlterVariantF c e xs, c x) => AlterVariantF c e (x ': xs) Source # | |
Defined in Haskus.Utils.EADT |
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 #
algVariantF'
Instances
AlgVariantF c e ([] :: [* -> *]) Source # | |
Defined in Haskus.Utils.EADT algVariantF' :: (forall (f :: * -> *). c f => f e -> e) -> Word -> Any -> e | |
(AlgVariantF c e xs, c x) => AlgVariantF c e (x ': xs) Source # | |
Defined in Haskus.Utils.EADT 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
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 # | |
Defined in Haskus.Utils.Variant |
module Haskus.Utils.Functor