fused-effects-1.0.2.0: A fast, flexible, fused effect system.

Control.Effect.Sum

Contents

Description

Operations on sums, combining effects into a signature.

Since: 0.1.0.0

Synopsis

# Membership

class Member (sub :: (* -> *) -> * -> *) sup where Source #

The class of types present in a signature.

This is based on Wouter Swierstra’s design described in Data types à la carte. As described therein, overlapping instances are required in order to distinguish e.g. left-occurrence from right-recursion.

It should not generally be necessary for you to define new Member instances, but these are not specifically prohibited if you wish to get creative.

Since: 0.1.0.0

Methods

inj :: sub m a -> sup m a Source #

Inject a member of a signature into the signature.

#### Instances

Instances details
 Member t t Source # Reflexivity: t is a member of itself. Instance detailsDefined in Control.Effect.Sum Methodsinj :: forall (m :: Type -> Type) a. t m a -> t m a Source # Member l r => Member l (l' :+: r) Source # Right-recursion: if t is a member of r, we can inject it into r in O(n), followed by lifting that into l :+: r in O(1). Instance detailsDefined in Control.Effect.Sum Methodsinj :: forall (m :: Type -> Type) a. l m a -> (l' :+: r) m a Source # Member l (l :+: r) Source # Left-occurrence: if t is at the head of a signature, we can inject it in O(1). Instance detailsDefined in Control.Effect.Sum Methodsinj :: forall (m :: Type -> Type) a. l m a -> (l :+: r) m a Source # Member t (l1 :+: (l2 :+: r)) => Member t ((l1 :+: l2) :+: r) Source # Left-recursion: if t is a member of l1 :+: l2 :+: r, then we can inject it into (l1 :+: l2) :+: r by injection into a right-recursive signature, followed by left-association. Instance detailsDefined in Control.Effect.Sum Methodsinj :: forall (m :: Type -> Type) a. t m a -> ((l1 :+: l2) :+: r) m a Source #

type family Members sub sup :: Constraint where ... Source #

Decompose sums on the left into multiple Member constraints.

Note that while this, and by extension Has, can be used to group together multiple membership checks into a single (composite) constraint, large signatures on the left can slow compiles down due to a problem with recursive type families.

Since: 1.0.0.0

Equations

 Members (l :+: r) u = (Members l u, Members r u) Members t u = Member t u

# Sums

data (f :+: g) (m :: * -> *) k infixr 4 Source #

Higher-order sums are used to combine multiple effects into a signature, typically by chaining on the right.

Constructors

 L (f m k) R (g m k)

#### Instances

Instances details
 Source # Instance detailsDefined in Control.Algebra Methodsalg :: NonDet [] a -> [a] Source # LabelledMember label l r => LabelledMember (label :: k) l (l' :+: r) Source # Right-recursion: if t is a member of r, we can inject it into r in O(n), followed by lifting that into l :+: r in O(1). Instance detailsDefined in Control.Effect.Labelled MethodsinjLabelled :: forall (m :: Type -> Type) a. Labelled label l m a -> (l' :+: r) m a Source # LabelledMember (label :: k) l (Labelled label l :+: r) Source # Left-occurrence: if t is at the head of a signature, we can inject it in O(1). Instance detailsDefined in Control.Effect.Labelled MethodsinjLabelled :: forall (m :: Type -> Type) a. Labelled label l m a -> (Labelled label l :+: r) m a Source # LabelledMember label t (l1 :+: (l2 :+: r)) => LabelledMember (label :: k) t ((l1 :+: l2) :+: r) Source # Left-recursion: if t is a member of l1 :+: l2 :+: r, then we can inject it into (l1 :+: l2) :+: r by injection into a right-recursive signature, followed by left-association. Instance detailsDefined in Control.Effect.Labelled MethodsinjLabelled :: forall (m :: Type -> Type) a. Labelled label t m a -> ((l1 :+: l2) :+: r) m a Source # Member l r => Member l (l' :+: r) Source # Right-recursion: if t is a member of r, we can inject it into r in O(n), followed by lifting that into l :+: r in O(1). Instance detailsDefined in Control.Effect.Sum Methodsinj :: forall (m :: Type -> Type) a. l m a -> (l' :+: r) m a Source # Member l (l :+: r) Source # Left-occurrence: if t is at the head of a signature, we can inject it in O(1). Instance detailsDefined in Control.Effect.Sum Methodsinj :: forall (m :: Type -> Type) a. l m a -> (l :+: r) m a Source # Member t (l1 :+: (l2 :+: r)) => Member t ((l1 :+: l2) :+: r) Source # Left-recursion: if t is a member of l1 :+: l2 :+: r, then we can inject it into (l1 :+: l2) :+: r by injection into a right-recursive signature, followed by left-association. Instance detailsDefined in Control.Effect.Sum Methodsinj :: forall (m :: Type -> Type) a. t m a -> ((l1 :+: l2) :+: r) m a Source # Algebra (Error e) (Either e) Source # Instance detailsDefined in Control.Algebra Methodsalg :: Error e (Either e) a -> Either e a Source # Generic1 ((f :+: g) m :: Type -> Type) Source # Instance detailsDefined in Control.Effect.Sum Associated Typestype Rep1 ((f :+: g) m) :: k -> Type # Methodsfrom1 :: forall (a :: k). (f :+: g) m a -> Rep1 ((f :+: g) m) a #to1 :: forall (a :: k). Rep1 ((f :+: g) m) a -> (f :+: g) m a # (Effect f, Effect g) => Effect (f :+: g) Source # Instance detailsDefined in Control.Effect.Sum Methodsthread :: (Functor ctx, Monad m) => ctx () -> (forall x. ctx (m x) -> n (ctx x)) -> (f :+: g) m a -> (f :+: g) n (ctx a) Source # (HFunctor f, HFunctor g) => HFunctor (f :+: g) Source # Instance detailsDefined in Control.Effect.Sum Methodshmap :: Functor m => (forall x. m x -> n x) -> (f :+: g) m a -> (f :+: g) n a Source # (Algebra sig m, Effect sig) => Algebra (Choose :+: sig) (ChooseC m) Source # Instance detailsDefined in Control.Carrier.Choose.Church Methodsalg :: (Choose :+: sig) (ChooseC m) a -> ChooseC m a Source # (Algebra sig m, Effect sig) => Algebra (Empty :+: sig) (EmptyC m) Source # Instance detailsDefined in Control.Carrier.Empty.Maybe Methodsalg :: (Empty :+: sig) (EmptyC m) a -> EmptyC m a Source # (Algebra sig m, Effect sig) => Algebra (NonDet :+: sig) (NonDetC m) Source # Instance detailsDefined in Control.Carrier.NonDet.Church Methodsalg :: (NonDet :+: sig) (NonDetC m) a -> NonDetC m a Source # (MonadIO m, Algebra sig m) => Algebra (Trace :+: sig) (TraceC m) Source # Instance detailsDefined in Control.Carrier.Trace.Printing Methodsalg :: (Trace :+: sig) (TraceC m) a -> TraceC m a Source # Algebra sig m => Algebra (Trace :+: sig) (TraceC m) Source # Instance detailsDefined in Control.Carrier.Trace.Ignoring Methodsalg :: (Trace :+: sig) (TraceC m) a -> TraceC m a Source # (Algebra sig m, Effect sig) => Algebra (Trace :+: sig) (TraceC m) Source # Instance detailsDefined in Control.Carrier.Trace.Returning Methodsalg :: (Trace :+: sig) (TraceC m) a -> TraceC m a Source # (Algebra sig m, Effect sig) => Algebra (Fail :+: sig) (FailC m) Source # Instance detailsDefined in Control.Carrier.Fail.Either Methodsalg :: (Fail :+: sig) (FailC m) a -> FailC m a Source # (Algebra sig m, Effect sig) => Algebra (Fresh :+: sig) (FreshC m) Source # Instance detailsDefined in Control.Carrier.Fresh.Strict Methodsalg :: (Fresh :+: sig) (FreshC m) a -> FreshC m a Source # (Algebra sig m, Effect sig) => Algebra (Cut :+: (NonDet :+: sig)) (CutC m) Source # Instance detailsDefined in Control.Carrier.Cut.Church Methodsalg :: (Cut :+: (NonDet :+: sig)) (CutC m) a -> CutC m a Source # (Algebra sig m, Effect sig) => Algebra (Cull :+: (NonDet :+: sig)) (CullC m) Source # Instance detailsDefined in Control.Carrier.Cull.Church Methodsalg :: (Cull :+: (NonDet :+: sig)) (CullC m) a -> CullC m a Source # Algebra sig m => Algebra (Reader r :+: sig) (ReaderT r m) Source # Instance detailsDefined in Control.Algebra Methodsalg :: (Reader r :+: sig) (ReaderT r m) a -> ReaderT r m a Source # Algebra sig m => Algebra (Reader r :+: sig) (ReaderC r m) Source # Instance detailsDefined in Control.Carrier.Reader Methodsalg :: (Reader r :+: sig) (ReaderC r m) a -> ReaderC r m a Source # (Algebra sig m, Effect sig) => Algebra (State s :+: sig) (StateT s m) Source # Instance detailsDefined in Control.Algebra Methodsalg :: (State s :+: sig) (StateT s m) a -> StateT s m a Source # (Algebra sig m, Effect sig) => Algebra (State s :+: sig) (StateT s m) Source # Instance detailsDefined in Control.Algebra Methodsalg :: (State s :+: sig) (StateT s m) a -> StateT s m a Source # (Algebra sig m, Effect sig) => Algebra (State s :+: sig) (StateC s m) Source # Instance detailsDefined in Control.Carrier.State.Strict Methodsalg :: (State s :+: sig) (StateC s m) a -> StateC s m a Source # (Algebra sig m, Effect sig) => Algebra (State s :+: sig) (StateC s m) Source # Instance detailsDefined in Control.Carrier.State.Lazy Methodsalg :: (State s :+: sig) (StateC s m) a -> StateC s m a Source # (Algebra sig m, Effect sig) => Algebra (Throw e :+: sig) (ThrowC e m) Source # Instance detailsDefined in Control.Carrier.Throw.Either Methodsalg :: (Throw e :+: sig) (ThrowC e m) a -> ThrowC e m a Source # (Algebra sig m, Effect sig) => Algebra (Error e :+: sig) (ExceptT e m) Source # Instance detailsDefined in Control.Algebra Methodsalg :: (Error e :+: sig) (ExceptT e m) a -> ExceptT e m a Source # (Algebra sig m, Effect sig) => Algebra (Error e :+: sig) (ErrorC e m) Source # Instance detailsDefined in Control.Carrier.Error.Either Methodsalg :: (Error e :+: sig) (ErrorC e m) a -> ErrorC e m a Source # (Algebra sig m, Effect sig, Monoid w) => Algebra (Writer w :+: sig) (WriterT w m) Source # Instance detailsDefined in Control.Algebra Methodsalg :: (Writer w :+: sig) (WriterT w m) a -> WriterT w m a Source # (Algebra sig m, Effect sig, Monoid w) => Algebra (Writer w :+: sig) (WriterT w m) Source # Instance detailsDefined in Control.Algebra Methodsalg :: (Writer w :+: sig) (WriterT w m) a -> WriterT w m a Source # (Monoid w, Algebra sig m, Effect sig) => Algebra (Writer w :+: sig) (WriterC w m) Source # Instance detailsDefined in Control.Carrier.Writer.Strict Methodsalg :: (Writer w :+: sig) (WriterC w m) a -> WriterC w m a Source # (HFunctor eff, HFunctor sig, Reifies s (Handler eff m), Monad m, Algebra sig m) => Algebra (eff :+: sig) (InterpretC s eff m) Source # Instance detailsDefined in Control.Carrier.Interpret Methodsalg :: (eff :+: sig) (InterpretC s eff m) a -> InterpretC s eff m a Source # (LabelledMember label sub sig, HFunctor sub, Algebra sig m) => Algebra (sub :+: sig) (UnderLabel label sub m) Source # Instance detailsDefined in Control.Effect.Labelled Methodsalg :: (sub :+: sig) (UnderLabel label sub m) a -> UnderLabel label sub m a Source # (Algebra sig m, Effect sig, Monoid w) => Algebra (Reader r :+: (Writer w :+: (State s :+: sig))) (RWST r w s m) Source # Instance detailsDefined in Control.Algebra Methodsalg :: (Reader r :+: (Writer w :+: (State s :+: sig))) (RWST r w s m) a -> RWST r w s m a Source # (Algebra sig m, Effect sig, Monoid w) => Algebra (Reader r :+: (Writer w :+: (State s :+: sig))) (RWST r w s m) Source # Instance detailsDefined in Control.Algebra Methodsalg :: (Reader r :+: (Writer w :+: (State s :+: sig))) (RWST r w s m) a -> RWST r w s m a Source # (Algebra (eff :+: sig) (sub m), HFunctor eff, HFunctor sig) => Algebra (Labelled label eff :+: sig) (Labelled label sub m) Source # Instance detailsDefined in Control.Effect.Labelled Methodsalg :: (Labelled label eff :+: sig) (Labelled label sub m) a -> Labelled label sub m a Source # (Functor (f m), Functor (g m)) => Functor ((f :+: g) m) Source # Instance detailsDefined in Control.Effect.Sum Methodsfmap :: (a -> b) -> (f :+: g) m a -> (f :+: g) m b #(<\$) :: a -> (f :+: g) m b -> (f :+: g) m a # (Foldable (f m), Foldable (g m)) => Foldable ((f :+: g) m) Source # Instance detailsDefined in Control.Effect.Sum Methodsfold :: Monoid m0 => (f :+: g) m m0 -> m0 #foldMap :: Monoid m0 => (a -> m0) -> (f :+: g) m a -> m0 #foldMap' :: Monoid m0 => (a -> m0) -> (f :+: g) m a -> m0 #foldr :: (a -> b -> b) -> b -> (f :+: g) m a -> b #foldr' :: (a -> b -> b) -> b -> (f :+: g) m a -> b #foldl :: (b -> a -> b) -> b -> (f :+: g) m a -> b #foldl' :: (b -> a -> b) -> b -> (f :+: g) m a -> b #foldr1 :: (a -> a -> a) -> (f :+: g) m a -> a #foldl1 :: (a -> a -> a) -> (f :+: g) m a -> a #toList :: (f :+: g) m a -> [a] #null :: (f :+: g) m a -> Bool #length :: (f :+: g) m a -> Int #elem :: Eq a => a -> (f :+: g) m a -> Bool #maximum :: Ord a => (f :+: g) m a -> a #minimum :: Ord a => (f :+: g) m a -> a #sum :: Num a => (f :+: g) m a -> a #product :: Num a => (f :+: g) m a -> a # (Traversable (f m), Traversable (g m)) => Traversable ((f :+: g) m) Source # Instance detailsDefined in Control.Effect.Sum Methodstraverse :: Applicative f0 => (a -> f0 b) -> (f :+: g) m a -> f0 ((f :+: g) m b) #sequenceA :: Applicative f0 => (f :+: g) m (f0 a) -> f0 ((f :+: g) m a) #mapM :: Monad m0 => (a -> m0 b) -> (f :+: g) m a -> m0 ((f :+: g) m b) #sequence :: Monad m0 => (f :+: g) m (m0 a) -> m0 ((f :+: g) m a) # (Eq (f m k), Eq (g m k)) => Eq ((f :+: g) m k) Source # Instance detailsDefined in Control.Effect.Sum Methods(==) :: (f :+: g) m k -> (f :+: g) m k -> Bool #(/=) :: (f :+: g) m k -> (f :+: g) m k -> Bool # (Ord (f m k), Ord (g m k)) => Ord ((f :+: g) m k) Source # Instance detailsDefined in Control.Effect.Sum Methodscompare :: (f :+: g) m k -> (f :+: g) m k -> Ordering #(<) :: (f :+: g) m k -> (f :+: g) m k -> Bool #(<=) :: (f :+: g) m k -> (f :+: g) m k -> Bool #(>) :: (f :+: g) m k -> (f :+: g) m k -> Bool #(>=) :: (f :+: g) m k -> (f :+: g) m k -> Bool #max :: (f :+: g) m k -> (f :+: g) m k -> (f :+: g) m k #min :: (f :+: g) m k -> (f :+: g) m k -> (f :+: g) m k # (Show (f m k), Show (g m k)) => Show ((f :+: g) m k) Source # Instance detailsDefined in Control.Effect.Sum MethodsshowsPrec :: Int -> (f :+: g) m k -> ShowS #show :: (f :+: g) m k -> String #showList :: [(f :+: g) m k] -> ShowS # type Rep1 ((f :+: g) m :: Type -> Type) Source # Instance detailsDefined in Control.Effect.Sum type Rep1 ((f :+: g) m :: Type -> Type) = D1 ('MetaData ":+:" "Control.Effect.Sum" "fused-effects-1.0.2.0-inplace" 'False) (C1 ('MetaCons "L" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec1 (f m))) :+: C1 ('MetaCons "R" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec1 (g m))))

reassociateSumL :: (l1 :+: (l2 :+: r)) m a -> ((l1 :+: l2) :+: r) m a Source #

Reassociate a right-nested sum leftwards.

Since: 1.0.2.0