File tree 1 file changed +14
-11
lines changed
1 file changed +14
-11
lines changed Original file line number Diff line number Diff line change @@ -4,44 +4,47 @@ import cps, std/sugar
4
4
type
5
5
Coroutine = ref object of Continuation
6
6
data: int
7
- next : Coroutine
7
+ suspended : Coroutine
8
8
9
9
# Used to both launch and continue the execution of coroutines
10
- template resume (c: Coroutine ): Coroutine =
11
- trampoline c
10
+ template resume (c: Coroutine ): untyped =
11
+ discard trampoline c
12
12
13
13
proc recv (c: Coroutine ): int {.cpsVoodoo .} =
14
14
c.data
15
15
16
16
# Suspend execution of the coroutine
17
- proc jield (c: Coroutine ): Coroutine {.cpsMagic .} =
18
- c.next = c
19
- return nil
17
+ proc suspend (c: Coroutine ): Coroutine {.cpsMagic .} =
18
+ c.suspended = c
20
19
21
20
proc send (c: Coroutine , n: int ) =
22
21
c.data = n
23
- discard c.next. resume ()
22
+ resume c.suspended
24
23
25
24
# This coroutine receives the data, applies f and sends the result to consumer
26
25
proc filter (dest: Coroutine , f: proc (x: int ): int ) {.cps :Coroutine .} =
27
26
while true :
28
- jield ()
27
+ suspend ()
29
28
let n = f (recv ())
30
29
dest.send (n)
31
30
32
31
# This coroutine receives ints through filter and prints them
33
32
proc consumer () {.cps :Coroutine .} =
34
33
while true :
35
- jield ()
34
+ suspend ()
36
35
let value = recv ()
37
36
echo value
38
37
39
38
let coro2 = whelp consumer ()
40
39
let coro1 = whelp filter (coro2, x => x * 2 )
41
40
42
- discard coro1. resume ()
43
- discard coro2. resume ()
41
+ resume coro1
42
+ resume coro2
44
43
45
44
# This prints numbers from 2 to 20 in 2 increment.
46
45
for i in 1 .. 10 :
47
46
coro1.send (i)
47
+
48
+ # break the cycles
49
+ reset coro1.suspended
50
+ reset coro2.suspended
You can’t perform that action at this time.
0 commit comments