UNPKG

@crinkle/petrinets

Version:
53 lines (52 loc) 1.95 kB
"use strict"; 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;