about summary refs log tree commit diff stats
path: root/archive/2.vm/channel.mu
diff options
context:
space:
mode:
Diffstat (limited to 'archive/2.vm/channel.mu')
-rw-r--r--archive/2.vm/channel.mu45
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
+]