// start snippet actor
function start(process) {
var inbox = newChannel();
spawn (function () {
var val = null;
while (true) {
val = <- inbox;
if (val == null) { return; }
process(val);
}
})();
return function (message) { message -> inbox; };
}
function send(actor, message) { actor(message); }
function stop(actor) { actor(null); }
// end snippet actor
(function () {
// start snippet printer
var printer = start(print);
spawn send(printer, "world");
send(printer, "hello");
stop(printer);
// end snippet printer
})();
// start snippet pair
function Pair(first, second) {
return function (command) {
if (command == "first") { return first; }
if (command == "second") { return second; }
return null;
};
}
function first(pair) { return pair("first"); }
function second(pair) { return pair("second"); }
// end snippet pair
// start snippet counter
function makeCounter() {
var value = 0;
return start(function (message) {
var command = first(message);
var arg = second(message);
if (command == "inc") { value = value + arg; }
if (command == "get") { send(arg, value); }
});
}
// end snippet counter
(function () {
// start snippet counter-demo
var printer = start(print);
var counter1 = makeCounter();
send(counter1, Pair("inc", 1));
send(counter1, Pair("get", printer));
send(counter1, Pair("inc", 2));
send(counter1, Pair("get", printer));
stop(counter1);
var counter2 = makeCounter();
send(counter2, Pair("inc", 5));
send(counter2, Pair("get", printer));
stop(counter2);
stop(printer);
// end snippet counter-demo
})();
// start snippet ping-pong
function makePingPonger(name) {
var self = null;
function pingPong(message) {
var value = first(message);
var other = second(message);
if (value == "done") {
print(name + " done");
spawn (function () { stop(self); } ());
return;
}
print(name + " " + value);
if (value == 0) {
print(name + " done");
send(other, Pair("done", self));
spawn (function () { stop(self); } ());
return;
}
send(other, Pair(value - 1, self));
}
self = start(pingPong);
return self;
}
// end snippet ping-pong
(function () {
// start snippet ping-pong-demo
var pinger = makePingPonger("ping");
var ponger = makePingPonger("pong");
send(pinger, Pair(10, ponger));
// end snippet ping-pong-demo
})();