syndicate-2017/js/compiler/demo-proper-interest-tracki...

79 lines
2.4 KiB
JavaScript

// Illustrates the response of asserted / retracted / during to
// observation of assertions discarding some of their dimensions.
//
// Should eventually be turned into some kind of test case.
var Syndicate = require('./src/main.js');
var Dataspace = Syndicate.Dataspace;
var Patch = Syndicate.Patch;
var __ = Syndicate.__;
assertion type ready(what);
assertion type entry(key, val);
ground dataspace {
spawn named 'listener' {
assert ready('listener');
on asserted entry($key, _) {
console.log('key asserted', key);
react {
on asserted entry(key, $value) { console.log('binding', key, '--->', value); }
on retracted entry(key, $value) { console.log('binding', key, '-/->', value); }
stop on retracted entry(key, _) {
console.log('key retracted', key);
}
}
}
}
spawn named 'other-listener' {
assert ready('other-listener');
during entry($key, _) {
on start { console.log('(other-listener) key asserted', key); }
during entry(key, $value) {
on start { console.log('(other-listener) binding', key, '--->', value); }
on stop { console.log('(other-listener) binding', key, '-/->', value); }
}
on stop { console.log('(other-listener) key retracted', key); }
}
}
function pause(k) {
console.log('pause');
react {
assert ready('pause');
on asserted ready('pause') {
return k();
}
}
}
spawn named 'driver' {
stop on asserted ready('listener') {
react {
stop on asserted ready('other-listener') {
Dataspace.stateChange(Patch.assert(entry('a', 1)));
Dataspace.stateChange(Patch.assert(entry('a', 2)));
Dataspace.stateChange(Patch.assert(entry('b', 3)));
Dataspace.stateChange(Patch.assert(entry('c', 33)));
Dataspace.stateChange(Patch.assert(entry('a', 4)));
Dataspace.stateChange(Patch.assert(entry('a', 5)));
pause(function () {
Dataspace.stateChange(Patch.retract(entry('a', 2)));
Dataspace.stateChange(Patch.retract(entry('c', 33)));
Dataspace.stateChange(Patch.assert(entry('a', 9)));
pause(function () {
Dataspace.stateChange(Patch.retract(entry('a', __)));
pause(function () {
console.log('done');
});
});
});
}
}
}
}
}