diff options
Diffstat (limited to 'archive/2.vm/channel.mu')
-rw-r--r-- | archive/2.vm/channel.mu | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/archive/2.vm/channel.mu b/archive/2.vm/channel.mu new file mode 100644 index 00000000..4a553148 --- /dev/null +++ b/archive/2.vm/channel.mu @@ -0,0 +1,45 @@ +# example program: communicating between routines using channels + +def producer sink:&:sink:char -> sink:&:sink:char [ + # produce characters 1 to 5 on a channel + local-scope + load-inputs + # n = 0 + n:char <- copy 0 + { + done?:bool <- lesser-than n, 5 + break-unless done? + # other threads might get between these prints + $print [produce: ], n, [ +] + sink <- write sink, n + n <- add n, 1 + loop + } + close sink +] + +def consumer source:&:source:char -> source:&:source:char [ + # consume and print integers from a channel + local-scope + load-inputs + { + # read an integer from the channel + n:char, eof?:bool, source <- read source + break-if eof? + # other threads might get between these prints + $print [consume: ], n:char, [ +] + loop + } +] + +def main [ + local-scope + source:&:source:char, sink:&:sink:char <- new-channel 3/capacity + # create two background 'routines' that communicate by a channel + routine1:num <- start-running producer, sink + routine2:num <- start-running consumer, source + wait-for-routine routine1 + wait-for-routine routine2 +] |