pipes-3.0.0: Compositional pipelines

Control.Proxy.Prelude.Kleisli

Contents

Description

Utility functions for Kleisli arrows

Synopsis

# Core utility functions

foreverK :: Monad m => (a -> m a) -> a -> m b Source #

Compose a 'K'leisli arrow with itself forever

Use foreverK to abstract away the following common recursion pattern:

p a = do
...
a' <- respond b
p a'

Using foreverK, you can instead write:

p = foreverK \$ \a -> do
...
respond b

replicateK :: Monad m => Int -> (a -> m a) -> a -> m a Source #

Repeat a 'K'leisli arrow multiple times

liftK :: (Monad m, MonadTrans t) => (a -> m b) -> a -> t m b Source #

Convenience function equivalent to (lift .)

liftK f >=> liftK g = liftK (f >=> g)

liftK return = return

hoistK :: (Monad m, MFunctor t) => (forall a. m a -> n a) -> (b' -> t m b) -> b' -> t n b Source #

Convenience function equivalent to (hoist f .)

hoistK f p1 >-> hoistK f p2 = hoistK f (p1 >-> p2)

hoistK f idT = idT
hoistK f p1 >=> hoistK f p2 = hoistK f (p1 >=> p2)

hoistK f return = return
hoistK f . hoistK g = hoistK (f . g)

hoistK id = id

raiseK :: (Monad m, MFunctor t1, MonadTrans t2) => (q -> t1 m r) -> q -> t1 (t2 m) r Source #

Convenience function equivalent to (hoist lift .)

raiseK p1 >-> raiseK p2 = raiseK (p1 >-> p2)

raiseK idT = idT
raiseK p1 >=> raiseK p2 = raiseK (p1 >=> p2)

raiseK return = return