| Copyright | (c) 2023 Yamada Ryo |
|---|---|
| License | MPL-2.0 (see the file LICENSE) |
| Maintainer | ymdfield@outlook.jp |
| Stability | experimental |
| Portability | portable |
| Safe Haskell | Safe-Inferred |
| Language | GHC2021 |
Control.Effect.Freer
Description
A Freer carrier that can be used as a handler for effect systems based
on classy-effects.
Synopsis
- newtype FreerUnion (fr :: Instruction -> (Type -> Type) -> Type -> Type) u (es :: [Instruction]) f a = FreerUnion {
- runFreerUnion :: fr (u es) f a
- type FreerEffects fr u es f = EffectsVia EffectDataHandler (FreerUnion fr u es f)
- unFreerEffects :: FreerEffects fr u es f ~> fr (u es) f
- freerEffects :: fr (u es) f ~> FreerEffects fr u es f
- newtype FreerUnionForSend handleHere fr u es f a = FreerUnionForSend {
- runFreerUnionForSend :: FreerUnion fr u es f a
- interpret :: (TransFreer c fr, Union u, c f) => (e ~> FreerEffects fr u es f) -> FreerEffects fr u (e ': es) f ~> FreerEffects fr u es f
- interpretT :: forall t fr u e es f. (MonadTransFreer fr, Union u, MonadTrans t, Monad f, Monad (t (FreerEffects fr u es f))) => (e ~> t (FreerEffects fr u es f)) -> FreerEffects fr u (e ': es) f ~> t (FreerEffects fr u es f)
- interpretK :: (MonadTransFreer fr, Union u, Monad f) => (a -> FreerEffects fr u es f r) -> (forall x. (x -> FreerEffects fr u es f r) -> e x -> FreerEffects fr u es f r) -> FreerEffects fr u (e ': es) f a -> FreerEffects fr u es f r
- interpretContT :: forall r fr u e es f. (MonadTransFreer fr, Union u, Monad f) => (e ~> ContT r (FreerEffects fr u es f)) -> FreerEffects fr u (e ': es) f ~> ContT r (FreerEffects fr u es f)
- interpretAll :: (TransFreer c fr, Union u, c f, c g) => (f ~> g) -> (u es ~> g) -> (e ~> g) -> FreerEffects fr u (e ': es) f ~> g
- reinterpret :: (TransFreer c fr, Union u, c f) => (e ~> FreerEffects fr u (e ': es) f) -> FreerEffects fr u (e ': es) f ~> FreerEffects fr u (e ': es) f
- transformAll :: (TransFreer c fr, Union u, Union u', c f) => (u es ~> u' es') -> FreerEffects fr u es f ~> FreerEffects fr u' es' f
- transform :: forall e' e fr u r f c. (TransFreer c fr, Union u, c f) => (e ~> e') -> FreerEffects fr u (e ': r) f ~> FreerEffects fr u (e' ': r) f
- untag :: forall tag e fr u r f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u (Tag e tag ': r) f ~> FreerEffects fr u (e ': r) f
- interpose :: forall e fr u es f c. (TransFreer c fr, Union u, Member u e es, c f) => (e ~> FreerEffects fr u es f) -> FreerEffects fr u es f ~> FreerEffects fr u es f
- interposeT :: forall e t fr u es m. (MonadTransFreer fr, Union u, Member u e es, Monad m, MonadTrans t, forall m1 m2 x. Coercible m1 m2 => Coercible (t m1 x) (t m2 x), Monad (t (fr (u es) m))) => (e ~> t (FreerEffects fr u es m)) -> FreerEffects fr u es m ~> t (FreerEffects fr u es m)
- interposeAll :: forall e g fr u es f c. (TransFreer c fr, Union u, Member u e es, c f, c g) => (f ~> g) -> (u es ~> g) -> (e ~> g) -> FreerEffects fr u es f ~> g
- interposeK :: (MonadTransFreer fr, Union u, Member u e es, Monad m) => (a -> FreerEffects fr u es m r) -> (forall x. (x -> FreerEffects fr u es m r) -> e x -> FreerEffects fr u es m r) -> FreerEffects fr u es m a -> FreerEffects fr u es m r
- interposeContT :: forall e r fr u es m. (MonadTransFreer fr, Union u, Member u e es, Monad m) => (e ~> ContT r (FreerEffects fr u es m)) -> FreerEffects fr u es m ~> ContT r (FreerEffects fr u es m)
- intercept :: forall e fr u es f c. (TransFreer c fr, Union u, Member u e es, c f) => (e ~> e) -> FreerEffects fr u es f ~> FreerEffects fr u es f
- raise :: forall e es fr u f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u es f ~> FreerEffects fr u (e ': es) f
- raise2 :: forall e1 e2 es fr u f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u es f ~> FreerEffects fr u (e1 ': (e2 ': es)) f
- raise3 :: forall e1 e2 e3 es fr u f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u es f ~> FreerEffects fr u (e1 ': (e2 ': (e3 ': es))) f
- raise4 :: forall e1 e2 e3 e4 es fr u f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u es f ~> FreerEffects fr u (e1 ': (e2 ': (e3 ': (e4 ': es)))) f
- raiseUnder :: forall e1 e2 es fr u f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u (e1 ': es) f ~> FreerEffects fr u (e1 ': (e2 ': es)) f
- raiseUnder2 :: forall e1 e2 e3 es fr u f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u (e1 ': (e2 ': es)) f ~> FreerEffects fr u (e1 ': (e2 ': (e3 ': es))) f
- raiseUnder3 :: forall e1 e2 e3 e4 es fr u f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u (e1 ': (e2 ': (e3 ': es))) f ~> FreerEffects fr u (e1 ': (e2 ': (e3 ': (e4 ': es)))) f
- raise2Under :: forall e1 e2 e3 es fr u f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u (e1 ': es) f ~> FreerEffects fr u (e1 ': (e2 ': (e3 ': es))) f
- raise2Under2 :: forall e1 e2 e3 e4 es fr u f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u (e1 ': (e2 ': es)) f ~> FreerEffects fr u (e1 ': (e2 ': (e3 ': (e4 ': es)))) f
- raise3Under :: forall e1 e2 e3 e4 es fr u f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u (e1 ': es) f ~> FreerEffects fr u (e1 ': (e2 ': (e3 ': (e4 ': es)))) f
- flipFreer :: forall e1 e2 es fr u f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u (e1 ': (e2 ': es)) f ~> FreerEffects fr u (e2 ': (e1 ': es)) f
- flipFreer3 :: forall e1 e2 e3 es fr u f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u (e1 ': (e2 ': (e3 ': es))) f ~> FreerEffects fr u (e3 ': (e2 ': (e1 ': es))) f
- flipFreerUnder :: forall e1 e2 e3 es fr u f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u (e1 ': (e2 ': (e3 ': es))) f ~> FreerEffects fr u (e1 ': (e3 ': (e2 ': es))) f
- rotate3 :: forall e1 e2 e3 es fr u f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u (e1 ': (e2 ': (e3 ': es))) f ~> FreerEffects fr u (e2 ': (e3 ': (e1 ': es))) f
- rotate3' :: forall e1 e2 e3 es fr u f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u (e1 ': (e2 ': (e3 ': es))) f ~> FreerEffects fr u (e3 ': (e1 ': (e2 ': es))) f
- bundle2 :: forall e1 e2 es fr u f c u'. (TransFreer c fr, Union u, Union u', c f) => FreerEffects fr u (e1 ': (e2 ': es)) f ~> FreerEffects fr u (u' '[e1, e2] ': es) f
- bundle3 :: forall e1 e2 e3 es fr u f c u'. (TransFreer c fr, Union u, Union u', c f) => FreerEffects fr u (e1 ': (e2 ': (e3 ': es))) f ~> FreerEffects fr u (u' '[e1, e2, e3] ': es) f
- bundle4 :: forall e1 e2 e3 e4 es fr u f c u'. (TransFreer c fr, Union u, Union u', c f) => FreerEffects fr u (e1 ': (e2 ': (e3 ': (e4 ': es)))) f ~> FreerEffects fr u (u' '[e1, e2, e3, e4] ': es) f
- unbundle2 :: forall e1 e2 es fr u f c u'. (TransFreer c fr, Union u, Union u', c f) => FreerEffects fr u (u' '[e1, e2] ': es) f ~> FreerEffects fr u (e1 ': (e2 ': es)) f
- unbundle3 :: forall e1 e2 e3 es fr u f c u'. (TransFreer c fr, Union u, Union u', c f) => FreerEffects fr u (u' '[e1, e2, e3] ': es) f ~> FreerEffects fr u (e1 ': (e2 ': (e3 ': es))) f
- unbundle4 :: forall e1 e2 e3 e4 es fr u f c u'. (TransFreer c fr, Union u, Union u', c f) => FreerEffects fr u (u' '[e1, e2, e3, e4] ': es) f ~> FreerEffects fr u (e1 ': (e2 ': (e3 ': (e4 ': es)))) f
- hoistFreerEffects :: (TransFreer c fr, c f, c g) => (f ~> g) -> FreerEffects fr u es f ~> FreerEffects fr u es g
- lowerToIns :: (TransFreer c fr, c g, c (f + g), Union u) => FreerEffects fr u es (f + g) ~> FreerEffects fr u (f ': es) g
- insToLower :: (TransFreer c fr, c (f + g), c g, Union u) => FreerEffects fr u (f ': es) g ~> FreerEffects fr u es (f + g)
- interpretLower :: (TransFreer c fr, c f, c g) => (f ~> FreerEffects fr u es g) -> FreerEffects fr u es f ~> FreerEffects fr u es g
- overFreerEffects :: (fr (u es) f a -> fr' (u' es') g b) -> FreerEffects fr u es f a -> FreerEffects fr' u' es' g b
- interpreted :: (TransFreer c fr, c f, Union u) => FreerEffects fr u '[] f ~> f
- splitFreerEffects :: (TransFreer c fr', TransFreer c fr, c f, c (FreerEffects fr u es f), Union u) => FreerEffects fr u (e ': es) f ~> fr' e (FreerEffects fr u es f)
- subsume :: (TransFreer c fr, SendIns e (FreerEffects fr u es f), Union u, c f) => FreerEffects fr u (e ': es) f ~> FreerEffects fr u es f
- subsumeLower :: (TransFreer c fr, SendIns e f, Union u, c f) => FreerEffects fr u (e ': es) f ~> FreerEffects fr u es f
- liftLower :: (TransFreer c fr, c f) => f ~> FreerEffects fr u es f
- runIO :: MonadIO m => Fre (IO ': es) m ~> Fre es m
- runInterpret :: (TransFreer c fr, c f) => (u es ~> f) -> FreerEffects fr u es f ~> f
- runFreerEffects :: (TransFreer c fr, c f, Union u) => FreerEffects fr u '[f] f ~> f
- type Fre es f = FreerEffects FreerChurchT ExtensibleUnion es f
- type (<|) e es = Member ExtensibleUnion e es
Documentation
newtype FreerUnion (fr :: Instruction -> (Type -> Type) -> Type -> Type) u (es :: [Instruction]) f a Source #
A data type that wraps Freer with any encoding to become an instance of SendIns based on the
liftInsT from the TransFreer type class.
Constructors
| FreerUnion | |
Fields
| |
Instances
| SendIns e (FreerUnionForSend (IsMember e es) fr u es f) => SendIns e (FreerUnion fr u es f) Source # | |
Defined in Control.Effect.Freer Methods sendIns :: e a -> FreerUnion fr u es f a # | |
| Foldable (fr (u es) f) => Foldable (FreerUnion fr u es f) Source # | |
Defined in Control.Effect.Freer Methods fold :: Monoid m => FreerUnion fr u es f m -> m # foldMap :: Monoid m => (a -> m) -> FreerUnion fr u es f a -> m # foldMap' :: Monoid m => (a -> m) -> FreerUnion fr u es f a -> m # foldr :: (a -> b -> b) -> b -> FreerUnion fr u es f a -> b # foldr' :: (a -> b -> b) -> b -> FreerUnion fr u es f a -> b # foldl :: (b -> a -> b) -> b -> FreerUnion fr u es f a -> b # foldl' :: (b -> a -> b) -> b -> FreerUnion fr u es f a -> b # foldr1 :: (a -> a -> a) -> FreerUnion fr u es f a -> a # foldl1 :: (a -> a -> a) -> FreerUnion fr u es f a -> a # toList :: FreerUnion fr u es f a -> [a] # null :: FreerUnion fr u es f a -> Bool # length :: FreerUnion fr u es f a -> Int # elem :: Eq a => a -> FreerUnion fr u es f a -> Bool # maximum :: Ord a => FreerUnion fr u es f a -> a # minimum :: Ord a => FreerUnion fr u es f a -> a # sum :: Num a => FreerUnion fr u es f a -> a # product :: Num a => FreerUnion fr u es f a -> a # | |
| Traversable (fr (u es) f) => Traversable (FreerUnion fr u es f) Source # | |
Defined in Control.Effect.Freer Methods traverse :: Applicative f0 => (a -> f0 b) -> FreerUnion fr u es f a -> f0 (FreerUnion fr u es f b) # sequenceA :: Applicative f0 => FreerUnion fr u es f (f0 a) -> f0 (FreerUnion fr u es f a) # mapM :: Monad m => (a -> m b) -> FreerUnion fr u es f a -> m (FreerUnion fr u es f b) # sequence :: Monad m => FreerUnion fr u es f (m a) -> m (FreerUnion fr u es f a) # | |
| Alternative (fr (u es) f) => Alternative (FreerUnion fr u es f) Source # | |
Defined in Control.Effect.Freer Methods empty :: FreerUnion fr u es f a # (<|>) :: FreerUnion fr u es f a -> FreerUnion fr u es f a -> FreerUnion fr u es f a # some :: FreerUnion fr u es f a -> FreerUnion fr u es f [a] # many :: FreerUnion fr u es f a -> FreerUnion fr u es f [a] # | |
| Applicative (fr (u es) f) => Applicative (FreerUnion fr u es f) Source # | |
Defined in Control.Effect.Freer Methods pure :: a -> FreerUnion fr u es f a # (<*>) :: FreerUnion fr u es f (a -> b) -> FreerUnion fr u es f a -> FreerUnion fr u es f b # liftA2 :: (a -> b -> c) -> FreerUnion fr u es f a -> FreerUnion fr u es f b -> FreerUnion fr u es f c # (*>) :: FreerUnion fr u es f a -> FreerUnion fr u es f b -> FreerUnion fr u es f b # (<*) :: FreerUnion fr u es f a -> FreerUnion fr u es f b -> FreerUnion fr u es f a # | |
| Functor (fr (u es) f) => Functor (FreerUnion fr u es f) Source # | |
Defined in Control.Effect.Freer Methods fmap :: (a -> b) -> FreerUnion fr u es f a -> FreerUnion fr u es f b # (<$) :: a -> FreerUnion fr u es f b -> FreerUnion fr u es f a # | |
| Monad (fr (u es) f) => Monad (FreerUnion fr u es f) Source # | |
Defined in Control.Effect.Freer Methods (>>=) :: FreerUnion fr u es f a -> (a -> FreerUnion fr u es f b) -> FreerUnion fr u es f b # (>>) :: FreerUnion fr u es f a -> FreerUnion fr u es f b -> FreerUnion fr u es f b # return :: a -> FreerUnion fr u es f a # | |
| MonadPlus (fr (u es) f) => MonadPlus (FreerUnion fr u es f) Source # | |
Defined in Control.Effect.Freer Methods mzero :: FreerUnion fr u es f a # mplus :: FreerUnion fr u es f a -> FreerUnion fr u es f a -> FreerUnion fr u es f a # | |
type FreerEffects fr u es f = EffectsVia EffectDataHandler (FreerUnion fr u es f) Source #
A Freer carrier that can be used as a handler for effect systems based
on classy-effects.
unFreerEffects :: FreerEffects fr u es f ~> fr (u es) f Source #
Unwrap the FreerEffects wrapper.
freerEffects :: fr (u es) f ~> FreerEffects fr u es f Source #
Wrap with FreerEffects.
newtype FreerUnionForSend handleHere fr u es f a Source #
A wrapper data type designed to induce instance resolution to delegate the search for effect classes
to a lower carrier f even when there are no target effect classes in the effect class list es.
When a target effect class exists within es, handleHere is induced to be 'True; when it
doesn't exist, it's induced to be 'False.
Constructors
| FreerUnionForSend | |
Fields
| |
Instances
| (TransFreer c fr, SendIns e f, c f) => SendIns e (FreerUnionForSend 'False fr u es f) Source # | |
Defined in Control.Effect.Freer Methods sendIns :: e a -> FreerUnionForSend 'False fr u es f a # | |
| (TransFreer c fr, Union u, Member u e es) => SendIns e (FreerUnionForSend 'True fr u es f) Source # | |
Defined in Control.Effect.Freer Methods sendIns :: e a -> FreerUnionForSend 'True fr u es f a # | |
| Foldable (fr (u es) f) => Foldable (FreerUnionForSend handleHere fr u es f) Source # | |
Defined in Control.Effect.Freer Methods fold :: Monoid m => FreerUnionForSend handleHere fr u es f m -> m # foldMap :: Monoid m => (a -> m) -> FreerUnionForSend handleHere fr u es f a -> m # foldMap' :: Monoid m => (a -> m) -> FreerUnionForSend handleHere fr u es f a -> m # foldr :: (a -> b -> b) -> b -> FreerUnionForSend handleHere fr u es f a -> b # foldr' :: (a -> b -> b) -> b -> FreerUnionForSend handleHere fr u es f a -> b # foldl :: (b -> a -> b) -> b -> FreerUnionForSend handleHere fr u es f a -> b # foldl' :: (b -> a -> b) -> b -> FreerUnionForSend handleHere fr u es f a -> b # foldr1 :: (a -> a -> a) -> FreerUnionForSend handleHere fr u es f a -> a # foldl1 :: (a -> a -> a) -> FreerUnionForSend handleHere fr u es f a -> a # toList :: FreerUnionForSend handleHere fr u es f a -> [a] # null :: FreerUnionForSend handleHere fr u es f a -> Bool # length :: FreerUnionForSend handleHere fr u es f a -> Int # elem :: Eq a => a -> FreerUnionForSend handleHere fr u es f a -> Bool # maximum :: Ord a => FreerUnionForSend handleHere fr u es f a -> a # minimum :: Ord a => FreerUnionForSend handleHere fr u es f a -> a # sum :: Num a => FreerUnionForSend handleHere fr u es f a -> a # product :: Num a => FreerUnionForSend handleHere fr u es f a -> a # | |
| Traversable (fr (u es) f) => Traversable (FreerUnionForSend handleHere fr u es f) Source # | |
Defined in Control.Effect.Freer Methods traverse :: Applicative f0 => (a -> f0 b) -> FreerUnionForSend handleHere fr u es f a -> f0 (FreerUnionForSend handleHere fr u es f b) # sequenceA :: Applicative f0 => FreerUnionForSend handleHere fr u es f (f0 a) -> f0 (FreerUnionForSend handleHere fr u es f a) # mapM :: Monad m => (a -> m b) -> FreerUnionForSend handleHere fr u es f a -> m (FreerUnionForSend handleHere fr u es f b) # sequence :: Monad m => FreerUnionForSend handleHere fr u es f (m a) -> m (FreerUnionForSend handleHere fr u es f a) # | |
| Alternative (fr (u es) f) => Alternative (FreerUnionForSend handleHere fr u es f) Source # | |
Defined in Control.Effect.Freer Methods empty :: FreerUnionForSend handleHere fr u es f a # (<|>) :: FreerUnionForSend handleHere fr u es f a -> FreerUnionForSend handleHere fr u es f a -> FreerUnionForSend handleHere fr u es f a # some :: FreerUnionForSend handleHere fr u es f a -> FreerUnionForSend handleHere fr u es f [a] # many :: FreerUnionForSend handleHere fr u es f a -> FreerUnionForSend handleHere fr u es f [a] # | |
| Applicative (fr (u es) f) => Applicative (FreerUnionForSend handleHere fr u es f) Source # | |
Defined in Control.Effect.Freer Methods pure :: a -> FreerUnionForSend handleHere fr u es f a # (<*>) :: FreerUnionForSend handleHere fr u es f (a -> b) -> FreerUnionForSend handleHere fr u es f a -> FreerUnionForSend handleHere fr u es f b # liftA2 :: (a -> b -> c) -> FreerUnionForSend handleHere fr u es f a -> FreerUnionForSend handleHere fr u es f b -> FreerUnionForSend handleHere fr u es f c # (*>) :: FreerUnionForSend handleHere fr u es f a -> FreerUnionForSend handleHere fr u es f b -> FreerUnionForSend handleHere fr u es f b # (<*) :: FreerUnionForSend handleHere fr u es f a -> FreerUnionForSend handleHere fr u es f b -> FreerUnionForSend handleHere fr u es f a # | |
| Functor (fr (u es) f) => Functor (FreerUnionForSend handleHere fr u es f) Source # | |
Defined in Control.Effect.Freer Methods fmap :: (a -> b) -> FreerUnionForSend handleHere fr u es f a -> FreerUnionForSend handleHere fr u es f b # (<$) :: a -> FreerUnionForSend handleHere fr u es f b -> FreerUnionForSend handleHere fr u es f a # | |
| Monad (fr (u es) f) => Monad (FreerUnionForSend handleHere fr u es f) Source # | |
Defined in Control.Effect.Freer Methods (>>=) :: FreerUnionForSend handleHere fr u es f a -> (a -> FreerUnionForSend handleHere fr u es f b) -> FreerUnionForSend handleHere fr u es f b # (>>) :: FreerUnionForSend handleHere fr u es f a -> FreerUnionForSend handleHere fr u es f b -> FreerUnionForSend handleHere fr u es f b # return :: a -> FreerUnionForSend handleHere fr u es f a # | |
| MonadPlus (fr (u es) f) => MonadPlus (FreerUnionForSend handleHere fr u es f) Source # | |
Defined in Control.Effect.Freer Methods mzero :: FreerUnionForSend handleHere fr u es f a # mplus :: FreerUnionForSend handleHere fr u es f a -> FreerUnionForSend handleHere fr u es f a -> FreerUnionForSend handleHere fr u es f a # | |
interpret :: (TransFreer c fr, Union u, c f) => (e ~> FreerEffects fr u es f) -> FreerEffects fr u (e ': es) f ~> FreerEffects fr u es f Source #
Interpret the leading effect class in the effect class list.
interpretT :: forall t fr u e es f. (MonadTransFreer fr, Union u, MonadTrans t, Monad f, Monad (t (FreerEffects fr u es f))) => (e ~> t (FreerEffects fr u es f)) -> FreerEffects fr u (e ': es) f ~> t (FreerEffects fr u es f) Source #
Interpret the leading effect class in the effect class list using a monad transformer.
interpretK :: (MonadTransFreer fr, Union u, Monad f) => (a -> FreerEffects fr u es f r) -> (forall x. (x -> FreerEffects fr u es f r) -> e x -> FreerEffects fr u es f r) -> FreerEffects fr u (e ': es) f a -> FreerEffects fr u es f r Source #
Interpret the leading effect class in the effect class list using a delimited continuation.
interpretContT :: forall r fr u e es f. (MonadTransFreer fr, Union u, Monad f) => (e ~> ContT r (FreerEffects fr u es f)) -> FreerEffects fr u (e ': es) f ~> ContT r (FreerEffects fr u es f) Source #
Interpret the leading effect class in the effect class list using a continuation monad transformer.
interpretAll :: (TransFreer c fr, Union u, c f, c g) => (f ~> g) -> (u es ~> g) -> (e ~> g) -> FreerEffects fr u (e ': es) f ~> g Source #
Interpret not only the leading effect class but also all the remaining effect classes and the
underlying carrier simultaneously, transforming them into any carrier g.
reinterpret :: (TransFreer c fr, Union u, c f) => (e ~> FreerEffects fr u (e ': es) f) -> FreerEffects fr u (e ': es) f ~> FreerEffects fr u (e ': es) f Source #
Reinterpret the leading effect class in the effect class list.
transformAll :: (TransFreer c fr, Union u, Union u', c f) => (u es ~> u' es') -> FreerEffects fr u es f ~> FreerEffects fr u' es' f Source #
Transform all effect classes in the effect class list into another union of effect classes.
transform :: forall e' e fr u r f c. (TransFreer c fr, Union u, c f) => (e ~> e') -> FreerEffects fr u (e ': r) f ~> FreerEffects fr u (e' ': r) f Source #
Transform the leading effect class in the effect class list into another effect class.
untag :: forall tag e fr u r f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u (Tag e tag ': r) f ~> FreerEffects fr u (e ': r) f Source #
Remove the tag attached to the effect class.
interpose :: forall e fr u es f c. (TransFreer c fr, Union u, Member u e es, c f) => (e ~> FreerEffects fr u es f) -> FreerEffects fr u es f ~> FreerEffects fr u es f Source #
Interpose the effect class that exists within the effect class list.
interposeT :: forall e t fr u es m. (MonadTransFreer fr, Union u, Member u e es, Monad m, MonadTrans t, forall m1 m2 x. Coercible m1 m2 => Coercible (t m1 x) (t m2 x), Monad (t (fr (u es) m))) => (e ~> t (FreerEffects fr u es m)) -> FreerEffects fr u es m ~> t (FreerEffects fr u es m) Source #
Interpose the effect class that exists within the effect class list using a monad transformer.
interposeAll :: forall e g fr u es f c. (TransFreer c fr, Union u, Member u e es, c f, c g) => (f ~> g) -> (u es ~> g) -> (e ~> g) -> FreerEffects fr u es f ~> g Source #
Transform all other effect classes in the effect class list and the underlying carrier, along
with the effect class that exists within the effect class list, into any carrier g.
interposeK :: (MonadTransFreer fr, Union u, Member u e es, Monad m) => (a -> FreerEffects fr u es m r) -> (forall x. (x -> FreerEffects fr u es m r) -> e x -> FreerEffects fr u es m r) -> FreerEffects fr u es m a -> FreerEffects fr u es m r Source #
Interpose the effect class that exists within the effect class list using a delimited continuation.
interposeContT :: forall e r fr u es m. (MonadTransFreer fr, Union u, Member u e es, Monad m) => (e ~> ContT r (FreerEffects fr u es m)) -> FreerEffects fr u es m ~> ContT r (FreerEffects fr u es m) Source #
Interpose the effect class that exists within the effect class list using a continuation monad transformer.
intercept :: forall e fr u es f c. (TransFreer c fr, Union u, Member u e es, c f) => (e ~> e) -> FreerEffects fr u es f ~> FreerEffects fr u es f Source #
Transform the effect of the effect class that exists within the effect class list.
raise :: forall e es fr u f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u es f ~> FreerEffects fr u (e ': es) f Source #
Insert an arbitrary effect class at the beginning of the effect class list.
raise2 :: forall e1 e2 es fr u f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u es f ~> FreerEffects fr u (e1 ': (e2 ': es)) f Source #
Insert two arbitrary effect classes at the beginning of the effect class list.
raise3 :: forall e1 e2 e3 es fr u f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u es f ~> FreerEffects fr u (e1 ': (e2 ': (e3 ': es))) f Source #
Insert three arbitrary effect classes at the beginning of the effect class list.
raise4 :: forall e1 e2 e3 e4 es fr u f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u es f ~> FreerEffects fr u (e1 ': (e2 ': (e3 ': (e4 ': es)))) f Source #
Insert four arbitrary effect classes at the beginning of the effect class list.
raiseUnder :: forall e1 e2 es fr u f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u (e1 ': es) f ~> FreerEffects fr u (e1 ': (e2 ': es)) f Source #
Insert an arbitrary effect class below the leading effect class in the effect class list.
raiseUnder2 :: forall e1 e2 e3 es fr u f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u (e1 ': (e2 ': es)) f ~> FreerEffects fr u (e1 ': (e2 ': (e3 ': es))) f Source #
Insert an arbitrary effect class below the first two leading effect classes in the effect class list.
raiseUnder3 :: forall e1 e2 e3 e4 es fr u f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u (e1 ': (e2 ': (e3 ': es))) f ~> FreerEffects fr u (e1 ': (e2 ': (e3 ': (e4 ': es)))) f Source #
Insert an arbitrary effect class below the first three leading effect classes in the effect class list.
raise2Under :: forall e1 e2 e3 es fr u f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u (e1 ': es) f ~> FreerEffects fr u (e1 ': (e2 ': (e3 ': es))) f Source #
Insert two arbitrary effect classes below the leading effect class in the effect class list.
raise2Under2 :: forall e1 e2 e3 e4 es fr u f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u (e1 ': (e2 ': es)) f ~> FreerEffects fr u (e1 ': (e2 ': (e3 ': (e4 ': es)))) f Source #
Insert two arbitrary effect classes below the first two leading effect classes in the effect class list.
raise3Under :: forall e1 e2 e3 e4 es fr u f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u (e1 ': es) f ~> FreerEffects fr u (e1 ': (e2 ': (e3 ': (e4 ': es)))) f Source #
Inserts three arbitrary effect classes under the top effect class in the effect class list.
flipFreer :: forall e1 e2 es fr u f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u (e1 ': (e2 ': es)) f ~> FreerEffects fr u (e2 ': (e1 ': es)) f Source #
Swaps the top two effect classes in the effect class list.
flipFreer3 :: forall e1 e2 e3 es fr u f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u (e1 ': (e2 ': (e3 ': es))) f ~> FreerEffects fr u (e3 ': (e2 ': (e1 ': es))) f Source #
Reverses the order of the top three effect classes in the effect class list.
flipFreerUnder :: forall e1 e2 e3 es fr u f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u (e1 ': (e2 ': (e3 ': es))) f ~> FreerEffects fr u (e1 ': (e3 ': (e2 ': es))) f Source #
Swaps the second and third effect classes from the top in the effect class list.
rotate3 :: forall e1 e2 e3 es fr u f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u (e1 ': (e2 ': (e3 ': es))) f ~> FreerEffects fr u (e2 ': (e3 ': (e1 ': es))) f Source #
Rotates the top three effect classes in the effect class list to the left.
rotate3' :: forall e1 e2 e3 es fr u f c. (TransFreer c fr, Union u, c f) => FreerEffects fr u (e1 ': (e2 ': (e3 ': es))) f ~> FreerEffects fr u (e3 ': (e1 ': (e2 ': es))) f Source #
Rotates the top three effect classes in the effect class list to the left twice.
bundle2 :: forall e1 e2 es fr u f c u'. (TransFreer c fr, Union u, Union u', c f) => FreerEffects fr u (e1 ': (e2 ': es)) f ~> FreerEffects fr u (u' '[e1, e2] ': es) f Source #
Bundles the top two effect classes in the effect class list into any open union.
bundle3 :: forall e1 e2 e3 es fr u f c u'. (TransFreer c fr, Union u, Union u', c f) => FreerEffects fr u (e1 ': (e2 ': (e3 ': es))) f ~> FreerEffects fr u (u' '[e1, e2, e3] ': es) f Source #
Bundles the top three effect classes in the effect class list into any open union.
bundle4 :: forall e1 e2 e3 e4 es fr u f c u'. (TransFreer c fr, Union u, Union u', c f) => FreerEffects fr u (e1 ': (e2 ': (e3 ': (e4 ': es)))) f ~> FreerEffects fr u (u' '[e1, e2, e3, e4] ': es) f Source #
Bundles the top four effect classes in the effect class list into any open union.
unbundle2 :: forall e1 e2 es fr u f c u'. (TransFreer c fr, Union u, Union u', c f) => FreerEffects fr u (u' '[e1, e2] ': es) f ~> FreerEffects fr u (e1 ': (e2 ': es)) f Source #
Expands the open union at the top of the effect class list.
unbundle3 :: forall e1 e2 e3 es fr u f c u'. (TransFreer c fr, Union u, Union u', c f) => FreerEffects fr u (u' '[e1, e2, e3] ': es) f ~> FreerEffects fr u (e1 ': (e2 ': (e3 ': es))) f Source #
Expands the open union at the top of the effect class list.
unbundle4 :: forall e1 e2 e3 e4 es fr u f c u'. (TransFreer c fr, Union u, Union u', c f) => FreerEffects fr u (u' '[e1, e2, e3, e4] ': es) f ~> FreerEffects fr u (e1 ': (e2 ': (e3 ': (e4 ': es)))) f Source #
Expands the open union at the top of the effect class list.
hoistFreerEffects :: (TransFreer c fr, c f, c g) => (f ~> g) -> FreerEffects fr u es f ~> FreerEffects fr u es g Source #
Transforms the lower carrier.
Warning: The given natural transformation must be a monad morphism (see https://hackage.haskell.org/package/mmorph-1.2.0/docs/Control-Monad-Morph.html). If not, the result will be ill-behaved.
lowerToIns :: (TransFreer c fr, c g, c (f + g), Union u) => FreerEffects fr u es (f + g) ~> FreerEffects fr u (f ': es) g Source #
Converts the lower carrier to an instruction.
insToLower :: (TransFreer c fr, c (f + g), c g, Union u) => FreerEffects fr u (f ': es) g ~> FreerEffects fr u es (f + g) Source #
Converts the instruction to the lower carrier.
interpretLower :: (TransFreer c fr, c f, c g) => (f ~> FreerEffects fr u es g) -> FreerEffects fr u es f ~> FreerEffects fr u es g Source #
Interprets the lower carrier.
Warning: The given natural transformation must be a monad morphism (see https://hackage.haskell.org/package/mmorph-1.2.0/docs/Control-Monad-Morph.html). If not, the result will be ill-behaved.
overFreerEffects :: (fr (u es) f a -> fr' (u' es') g b) -> FreerEffects fr u es f a -> FreerEffects fr' u' es' g b Source #
Accesses the inside of the FreerEffects wrapper.
interpreted :: (TransFreer c fr, c f, Union u) => FreerEffects fr u '[] f ~> f Source #
Drops a Freer with no effect classes to interpret to the lower carrier.
splitFreerEffects :: (TransFreer c fr', TransFreer c fr, c f, c (FreerEffects fr u es f), Union u) => FreerEffects fr u (e ': es) f ~> fr' e (FreerEffects fr u es f) Source #
Splits the Freer into the lower carrier.
subsume :: (TransFreer c fr, SendIns e (FreerEffects fr u es f), Union u, c f) => FreerEffects fr u (e ': es) f ~> FreerEffects fr u es f Source #
Transfer the effect to the underlying level.
subsumeLower :: (TransFreer c fr, SendIns e f, Union u, c f) => FreerEffects fr u (e ': es) f ~> FreerEffects fr u es f Source #
Transfer the effect to the lower carrier.
liftLower :: (TransFreer c fr, c f) => f ~> FreerEffects fr u es f Source #
Lifts the lower carrier.
runIO :: MonadIO m => Fre (IO ': es) m ~> Fre es m Source #
Embeds an IO action into a lower carrier that is a MonadIO.
runInterpret :: (TransFreer c fr, c f) => (u es ~> f) -> FreerEffects fr u es f ~> f Source #
Interprets all effects in the effect class list at once.
runFreerEffects :: (TransFreer c fr, c f, Union u) => FreerEffects fr u '[f] f ~> f Source #
Drops the Freer to the lower carrier.
type Fre es f = FreerEffects FreerChurchT ExtensibleUnion es f Source #
A type synonym for commonly used Monad Freer.
type (<|) e es = Member ExtensibleUnion e es Source #
An operator representing the membership relationship of the effect class list.