"use strict"; var Immutable = require('immutable'); var Dataspace = require('./dataspace.js').Dataspace; function Ground(bootFn) { var self = this; this.stepperId = null; this.baseStack = Immutable.List.of({ dataspace: this, activePid: -1 }); Dataspace.withDataspaceStack(this.baseStack, function () { self.dataspace = new Dataspace(bootFn); }); } Ground.prototype.step = function () { var self = this; return Dataspace.withDataspaceStack(this.baseStack, function () { return self.dataspace.step(); }); }; Ground.prototype.checkPid = function (pid) { if (pid !== -1) console.error('Weird pid in Ground', pid); }; Ground.prototype.markRunnable = function (pid) { this.checkPid(pid); this.startStepping(); }; Ground.prototype.startStepping = function () { var self = this; if (this.stepperId) return; if (this.step()) { this.stepperId = setTimeout(function () { self.stepperId = null; self.startStepping(); }, 0); } return this; // because the syndicatec compiler chains startStepping after the ctor }; Ground.prototype.stopStepping = function () { if (this.stepperId) { clearTimeout(this.stepperId); this.stepperId = null; } }; Ground.prototype.kill = function (pid, exn) { this.checkPid(pid); console.log("Ground dataspace terminated"); this.stopStepping(); }; Ground.prototype.enqueueAction = function (pid, action) { this.checkPid(pid); switch (action.type) { case 'stateChange': if (action.patch.isNonEmpty()) { console.error('You have subscribed to a nonexistent event source.', action.patch.pretty()); } break; case 'message': console.error('You have sent a message into the outer void.', action); break; default: console.error('Internal error: unexpected action at ground level', action); break; } }; /////////////////////////////////////////////////////////////////////////// module.exports.Ground = Ground;