demo-filesystem.js and attendant fixes
This commit is contained in:
parent
761f5652af
commit
64cbe51578
|
@ -182,7 +182,7 @@ var modifiedSourceActions = {
|
||||||
buildOnEvent(true,
|
buildOnEvent(true,
|
||||||
'retracted',
|
'retracted',
|
||||||
pattern.instantiatedSubscription,
|
pattern.instantiatedSubscription,
|
||||||
'null',
|
pattern.instantiatedProjection,
|
||||||
[],
|
[],
|
||||||
'{}') +
|
'{}') +
|
||||||
'.completeBuild(); }');
|
'.completeBuild(); }');
|
||||||
|
@ -252,6 +252,12 @@ semantics.addAttribute('instantiatedSubscription', {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
semantics.addAttribute('instantiatedProjection', {
|
||||||
|
_default: function(children) {
|
||||||
|
return buildSubscription(children, null, 'instantiated');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
semantics.addAttribute('projection', {
|
semantics.addAttribute('projection', {
|
||||||
_default: function(children) {
|
_default: function(children) {
|
||||||
return buildSubscription(children, null, 'projection');
|
return buildSubscription(children, null, 'projection');
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// node src/compiler.js src/demo-bankaccount.js | node
|
// bin/syndicatec compiler/demo-bankaccount.js | node
|
||||||
|
|
||||||
var Syndicate = require('./src/main.js');
|
var Syndicate = require('./src/main.js');
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,66 @@
|
||||||
|
// 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 network {
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
// 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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -99,7 +99,7 @@ Facet.prototype.onEvent = function(isTerminal, eventType, subscriptionFn, projec
|
||||||
? e.patch.added
|
? e.patch.added
|
||||||
: e.patch.removed,
|
: e.patch.removed,
|
||||||
compiledSpec);
|
compiledSpec);
|
||||||
if (objects) {
|
if (objects && objects.size > 0) {
|
||||||
// console.log(objects.toArray());
|
// console.log(objects.toArray());
|
||||||
if (isTerminal) { facet.terminate(); }
|
if (isTerminal) { facet.terminate(); }
|
||||||
objects.forEach(function (o) { Util.kwApply(handlerFn, facet.actor.state, o); });
|
objects.forEach(function (o) { Util.kwApply(handlerFn, facet.actor.state, o); });
|
||||||
|
|
|
@ -17,7 +17,7 @@ function makeStructureConstructor(label, argumentNames) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function isStructure(s) {
|
function isStructure(s) {
|
||||||
return !!(s.$SyndicateMeta$);
|
return (s !== null) && (typeof s === 'object') && ("$SyndicateMeta$" in s);
|
||||||
}
|
}
|
||||||
|
|
||||||
function structureToArray(s) {
|
function structureToArray(s) {
|
||||||
|
@ -138,7 +138,7 @@ function compilePattern(v, p) {
|
||||||
return rseq(SOA, acc);
|
return rseq(SOA, acc);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p.$SyndicateMeta$) {
|
if (isStructure(p)) {
|
||||||
var args = p.$SyndicateMeta$.arguments;
|
var args = p.$SyndicateMeta$.arguments;
|
||||||
acc = rseq(EOA, acc);
|
acc = rseq(EOA, acc);
|
||||||
for (var i = args.length - 1; i >= 0; i--) {
|
for (var i = args.length - 1; i >= 0; i--) {
|
||||||
|
@ -538,7 +538,7 @@ function matchValue(r, v) {
|
||||||
} else {
|
} else {
|
||||||
r = rlookup(r, __);
|
r = rlookup(r, __);
|
||||||
}
|
}
|
||||||
} else if (v.$SyndicateMeta$) {
|
} else if (isStructure(v)) {
|
||||||
if (r.has(SOA)) {
|
if (r.has(SOA)) {
|
||||||
r = rlookup(r, SOA);
|
r = rlookup(r, SOA);
|
||||||
stack.push(vs);
|
stack.push(vs);
|
||||||
|
@ -735,7 +735,7 @@ function compileProjection(/* projection, projection, ... */) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p.$SyndicateMeta$) {
|
if (isStructure(p)) {
|
||||||
acc.push(SOA);
|
acc.push(SOA);
|
||||||
acc.push(p.$SyndicateMeta$.label);
|
acc.push(p.$SyndicateMeta$.label);
|
||||||
var args = p.$SyndicateMeta$.arguments;
|
var args = p.$SyndicateMeta$.arguments;
|
||||||
|
@ -768,7 +768,7 @@ function projectionToPattern(p) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p.$SyndicateMeta$) {
|
if (isStructure(p)) {
|
||||||
var result = {"$SyndicateMeta$": p.$SyndicateMeta$};
|
var result = {"$SyndicateMeta$": p.$SyndicateMeta$};
|
||||||
var args = p.$SyndicateMeta$.arguments;
|
var args = p.$SyndicateMeta$.arguments;
|
||||||
for (var i = 0; i < args.length; i++) {
|
for (var i = 0; i < args.length; i++) {
|
||||||
|
|
Loading…
Reference in New Issue