inet-lib
Version:
JavaScript Engine for Interaction Nets
129 lines (96 loc) • 1.78 kB
JavaScript
;
const setup = require("./setup");
const format = require("./format");
const reset = format.reset;
const geteqn = format.geteqn;
const getconf = format.getconf;
let inenv, inqueue, table;
function reduce(pair)
{
const left = pair.left;
const right = pair.right;
const rule = pair.rule;
if (!rule(left, right))
throw "NO RULES: " + geteqn(pair);
++rule.count;
pair.left = void(0);
pair.right = void(0);
}
function prepare(src, fmt)
{
let system;
inenv = run.inenv;
system = setup(src, inenv);
table = system.rules;
inqueue = system.queue;
reset(fmt, system.types);
return inenv;
}
function debug()
{
const conf = getconf(inqueue);
const pair = inqueue.pop();
if (pair)
reduce(pair);
return conf;
}
function debug0()
{
const pair = inqueue.pop();
if (pair) {
reduce(pair);
return true;
}
}
function debug1()
{
const pair = inqueue.pop();
if (pair) {
const eqn = geteqn(pair);
reduce(pair);
return eqn;
}
}
function getstats()
{
const stats = {};
table.forEach(row => {
row.forEach(rule => {
const count = rule.count;
let human = rule.human;
if (!human || !count)
return;
human = human.split("><");
human = human.sort();
human = human.join("><");
if (stats[human])
stats[human] += count;
else
stats[human] = count;
});
});
return stats;
}
function perform(max)
{
const t0 = Date.now();
for (let i = 0; i < max; i++) {
if (!inqueue.length)
break;
reduce(inqueue.pop());
}
return Date.now() - t0;
}
function run(src, max)
{
prepare(src);
inenv.redtime = perform(max ? max : 1e7);
inenv.stats = getstats();
return inenv;
}
run.inenv = {};
run.prepare = prepare;
run.debug = debug;
run.debug0 = debug0;
run.debug1 = debug1;
module.exports = run;