fix other mandelbrot variants
[mu.git] / archive / 1.vm / channel.mu
blob4a553148cb85162095af5f3d23726c11c05bec63
1 # example program: communicating between routines using channels
3 def producer sink:&:sink:char -> sink:&:sink:char [
4   # produce characters 1 to 5 on a channel
5   local-scope
6   load-inputs
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, [ 
15     sink <- write sink, n
16     n <- add n, 1
17     loop
18   }
19   close sink
22 def consumer source:&:source:char -> source:&:source:char [
23   # consume and print integers from a channel
24   local-scope
25   load-inputs
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, [ 
33     loop
34   }
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