1
- -- | This module defines functions for creating coroutines on top of the `Aff` monad.
1
+ -- | This module defines functions for creating coroutines on top of the `Aff`
2
+ -- | monad.
2
3
-- |
3
- -- | The `Aff` monad only supports actions which return a single value, asynchronously, so this
4
- -- | module provides a principled way to deal with asynchronous _streams_ of values, and asynchronous consumers
5
- -- | of streamed data.
6
-
4
+ -- | The `Aff` monad only supports actions which return a single value,
5
+ -- | asynchronously, so this module provides a principled way to deal with
6
+ -- | asynchronous _streams_ of values, and asynchronous consumers of streamed
7
+ -- | data.
7
8
module Control.Coroutine.Aff where
8
9
9
10
import Prelude
10
11
11
12
import Control.Coroutine (Producer , producer )
12
- import Control.Monad .Aff (Aff , runAff , forkAff )
13
- import Control.Monad. Aff.AVar ( AVAR , makeEmptyVar , takeVar , putVar )
14
- import Control.Monad .Aff.Class (class MonadAff , liftAff )
15
- import Control.Monad.Eff ( Eff )
16
- import Control.Monad.Eff. Class (liftEff )
13
+ import Effect .Aff (Aff , runAff , forkAff )
14
+ import Effect. Aff.AVar as AVar
15
+ import Effect .Aff.Class (class MonadAff , liftAff )
16
+ import Effect ( Effect )
17
+ import Effect. Class (liftEffect )
17
18
import Control.Monad.Free.Trans (hoistFreeT )
18
19
import Control.Monad.Trans.Class (lift )
19
20
import Data.Either (Either (..))
20
21
import Data.Newtype (class Newtype )
21
22
22
- newtype Emitter m a r eff = Emitter (Step a r -> m ( avar :: AVAR | eff ) Unit )
23
+ newtype Emitter m a r = Emitter (Step a r -> m Unit )
23
24
24
- derive instance newtypeEmitter :: Newtype (Emitter m a r eff ) _
25
+ derive instance newtypeEmitter :: Newtype (Emitter m a r ) _
25
26
26
27
data Step a b
27
28
= Emit a
28
29
| Finish b
29
30
30
- emit
31
- :: forall m a r eff
32
- . Emitter m a r eff
33
- -> a
34
- -> m (avar :: AVAR | eff ) Unit
31
+ emit :: forall m a r . Emitter m a r -> a -> m Unit
35
32
emit (Emitter f) = f <<< Emit
36
33
37
- close
38
- :: forall m a r eff
39
- . Emitter m a r eff
40
- -> r
41
- -> m (avar :: AVAR | eff ) Unit
34
+ close :: forall m a r . Emitter m a r -> r -> m Unit
42
35
close (Emitter f) = f <<< Finish
43
36
44
37
-- | Create a `Producer` using an asynchronous callback.
@@ -56,20 +49,13 @@ close (Emitter f) = f <<< Finish
56
49
-- | log "Done!"
57
50
-- | close emitter "finished"
58
51
-- | ```
59
- produce
60
- :: forall a r eff
61
- . (Emitter Eff a r eff -> Eff (avar :: AVAR | eff ) Unit )
62
- -> Producer a (Aff (avar :: AVAR | eff )) r
52
+ produce :: forall a r . (Emitter Effect a r -> Effect Unit ) -> Producer a Aff r
63
53
produce recv = produceAff \(Emitter send) ->
64
- liftEff (recv (Emitter (void <<< runAff (const (pure unit)) <<< send)))
54
+ liftEffect (recv (Emitter (void <<< runAff (const (pure unit)) <<< send)))
65
55
66
56
-- | A version of `produce` that creates a `Producer` with an underlying
67
57
-- | `MonadAff`, rather than `Aff` specifically.
68
- produce'
69
- :: forall a r m eff
70
- . MonadAff (avar :: AVAR | eff ) m
71
- => (Emitter Eff a r eff -> Eff (avar :: AVAR | eff ) Unit )
72
- -> Producer a m r
58
+ produce' :: forall a r m . MonadAff m => (Emitter Effect a r -> Effect Unit ) -> Producer a m r
73
59
produce' = hoistFreeT liftAff <<< produce
74
60
75
61
-- | A variant of `produce` where the setup and callback functions use the `Aff`
@@ -84,13 +70,10 @@ produce' = hoistFreeT liftAff <<< produce
84
70
-- | delay $ Milliseconds 1000
85
71
-- | close emitter "finished"
86
72
-- | ```
87
- produceAff
88
- :: forall a r eff
89
- . (Emitter Aff a r eff -> Aff (avar :: AVAR | eff ) Unit )
90
- -> Producer a (Aff (avar :: AVAR | eff )) r
73
+ produceAff :: forall a r . (Emitter Aff a r -> Aff Unit ) -> Producer a Aff r
91
74
produceAff recv = do
92
- v <- lift makeEmptyVar
93
- _ <- lift (forkAff (recv (Emitter (flip putVar v))))
94
- producer $ takeVar v <#> case _ of
75
+ v <- lift AVar .empty
76
+ _ <- lift (forkAff (recv (Emitter (flip AVar .put v))))
77
+ producer $ AVar .take v <#> case _ of
95
78
Emit a -> Left a
96
79
Finish b -> Right b
0 commit comments