syndicate-2017/js/compiler/demo-filesystem.js

67 lines
1.8 KiB
JavaScript

// bin/syndicatec compiler/demo-filesystem.js | node
var Syndicate = require('./src/main.js');
assertion type file(name, content) = "file";
assertion type saveFile(name, content) = "save";
assertion type deleteFile(name) = "delete";
ground dataspace {
///////////////////////////////////////////////////////////////////////////
// The file system actor
actor {
this.files = {};
forever {
during Syndicate.observe(file($name, _)) {
init {
console.log("At least one reader exists for:", name);
}
assert file(name, this.files[name]);
done {
console.log("No remaining readers exist for:", name);
}
}
on message saveFile($name, $newcontent) {
this.files[name] = newcontent;
}
on message deleteFile($name) {
delete this.files[name];
}
}
}
///////////////////////////////////////////////////////////////////////////
// A simple demo client of the file system
actor {
state {
on asserted file("hello.txt", $content) {
console.log("hello.txt has content", JSON.stringify(content));
}
} until {
case asserted file("hello.txt", "quit demo") {
console.log("The hello.txt file contained 'quit demo', so we will quit");
}
}
until {
case asserted Syndicate.observe(saveFile(_, _)) {
:: saveFile("hello.txt", "a");
:: deleteFile("hello.txt");
:: saveFile("hello.txt", "c");
:: saveFile("hello.txt", "quit demo");
:: saveFile("hello.txt", "final contents");
actor {
until {
case asserted file("hello.txt", $content) {
console.log("second observer sees that hello.txt content is",
JSON.stringify(content));
}
}
}
}
}
}
}