@crinkle/petrinets
Version:
js petrinet
53 lines (52 loc) • 1.95 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
function petrinet(places, transitions) {
var _tokens = places.map(function (p) { return ({ place: p.key, amount: 0 }); });
function add(token) {
var index = _tokens.findIndex(function (m) { return m.place === token.place; });
if (index < 0)
return;
_tokens[index] = __assign(__assign({}, token), { amount: token.amount + _tokens[index].amount });
}
function removeToken(place) {
var index = _tokens.findIndex(function (m) { return m.place === place; });
_tokens[index] = { place: place, amount: _tokens[index].amount - 1 };
}
function canFire(places) {
return places.every(function (p) {
return _tokens.find(function (t) { return t.place === p.source && t.amount > 0; });
});
}
function fire(name) {
var transition = transitions.find(function (t) { return t.key === name; });
if (!transition || !canFire(transition.input))
return;
for (var i = 0; i < transition.input.length; i++) {
var arc = transition.input[i];
removeToken(arc.source);
}
for (var i = 0; i < transition.output.length; i++) {
var arc = transition.output[i];
add({ place: arc.target, amount: 1 });
}
}
return {
fire: fire,
add: add,
get marking() {
return _tokens.filter(function (t) { return t.amount > 0; });
},
};
}
exports.default = petrinet;