bluefin-0.0.8.0: The Bluefin effect system
Safe HaskellSafe-Inferred
LanguageHaskell2010

Bluefin.Coroutine

Synopsis

Documentation

Coroutine allows to yield values and receive results back. Wikipedia suggests that Bluefin's coroutines are "second-class stackful coroutines". This module is not documented yet. You might want to start with Bluefin.Stream, which is the most common way to use coroutines.

Handle

data Coroutine a b (e :: Effects) #

A handle to a coroutine that yields values of type a and then expects values of type b.

Instances

Instances details
Handle (Coroutine a b) 
Instance details

Defined in Bluefin.Internal

Methods

mapHandle :: forall (e :: Effects) (es :: Effects). e :> es => Coroutine a b e -> Coroutine a b es #

Handlers

forEach #

Arguments

:: forall a b (es :: Effects) r. (forall (e1 :: Effects). Coroutine a b e1 -> Eff (e1 :& es) r) 
-> (a -> Eff es b)

Apply this effectful function for each element of the coroutine

-> Eff es r 
>>> runPureEff $ yieldToList $ \y -> do
      forEach (inFoldable [0 .. 3]) $ \i -> do
        yield y i
        yield y (i * 10)
([0, 0, 1, 10, 2, 20, 3, 30], ())

connectCoroutines #

Arguments

:: forall (es :: Effects) a b r. (forall (e :: Effects). Coroutine a b e -> Eff (e :& es) r) 
-> (forall (e :: Effects). a -> Coroutine b a e -> Eff (e :& es) r) 
-> Eff es r

͘

Connect two coroutines. Their execution is interleaved by exchanging as and bs. When the first yields its first a it starts the second (which is awaiting an a).

Effectful operations

yieldCoroutine #

Arguments

:: forall (e1 :: Effects) (es :: Effects) a b. e1 :> es 
=> Coroutine a b e1 
-> a

͘

-> Eff es b