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 |
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.
FreerUnion | |
|
Instances
SendIns e (FreerUnionForSend (IsMember e es) fr u es f) => SendIns e (FreerUnion fr u es f) Source # | |
Defined in Control.Effect.Freer 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 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 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 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 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 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 (>>=) :: 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 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
.
FreerUnionForSend | |
|
Instances
(TransFreer c fr, SendIns e f, c f) => SendIns e (FreerUnionForSend 'False fr u es f) Source # | |
Defined in Control.Effect.Freer 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 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 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 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 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 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 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 (>>=) :: 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 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.