summaryrefslogtreecommitdiff
path: root/Channels/chans.b
diff options
context:
space:
mode:
Diffstat (limited to 'Channels/chans.b')
-rw-r--r--Channels/chans.b39
1 files changed, 37 insertions, 2 deletions
diff --git a/Channels/chans.b b/Channels/chans.b
index 82945c8..700ea63 100644
--- a/Channels/chans.b
+++ b/Channels/chans.b
@@ -10,11 +10,46 @@ Chans: module {
init: fn(nil: ref Draw->Context, nil: list of string);
};
+summer(done: chan of int, msg: chan of string, num: chan of (int, int)) {
+ sum := big 0;
+ run := 1;
+
+ while(run)
+ alt {
+ (n, p) := <-num =>
+ sum += big n**p;
+ print("Sum: %bd\n", sum);
+ <-done =>
+ msg <-= string sum;
+ run = 0;
+ * =>
+ sys->sleep(5);
+ }
+}
+
init(nil: ref Draw->Context, nil: list of string) {
sys = load Sys Sys->PATH;
-
+ n := 4;
+ done := chan of int;
+ msgChan := chan[0] of string;
+ numChan := chan[n] of (int, int);
+
+ spawn summer(done, msgChan, numChan);
+
+ for(i := 0; i < 15; i++)
+ numChan <-= (i, 2);
+
+ done <-= 0;
+
+ print("Final sum: %s\n", <-msgChan);
+
+ buf := chan[20] of int;
+
+ print("Len: %d\n", len buf);
+
+ for(i = 0; i < 5; i++)
+ buf <-= i;
exit;
}
-