1 # example program: communicating between routines using channels
 2 
 3 def producer sink:&:sink:char -> sink:&:sink:char [
 4   # produce characters 1 to 5 on a channel
 5   local-scope
 6   load-ingredients
 7   # n = 0
 8   n:char <- copy 0
 9   {
10   ¦ done?:bool <- lesser-than n, 5
11   ¦ break-unless done?
12   ¦ # other threads might get between these prints
13   ¦ $print [produce: ], n, [ 
14 ]
15   ¦ sink <- write sink, n
16   ¦ n <- add n, 1
17   ¦ loop
18   }
19   close sink
20 ]
21 
22 def consumer source:&:source:char -> source:&:source:char [
23   # consume and print integers from a channel
24   local-scope
25   load-ingredients
26   {
27   ¦ # read an integer from the channel
28   ¦ n:char, eof?:bool, source <- read source
29   ¦ break-if eof?
30   ¦ # other threads might get between these prints
31   ¦ $print [consume: ], n:char, [ 
32 ]
33   ¦ loop
34   }
35 ]
36 
37 def main [
38   local-scope
39   source:&:source:char, sink:&:sink:char <- new-channel 3/capacity
40   # create two background 'routines' that communicate by a channel
41   routine1:num <- start-running producer, sink
42   routine2:num <- start-running consumer, source
43   wait-for-routine routine1
44   wait-for-routine routine2
45 ]