markings.js 5.35 KB
// Generated by CoffeeScript 2.0.2
(function() {
  var Marking, dicts, msets;

  dicts = require("./dicts");

  msets = require("./multisets");

  Marking = class Marking {
    constructor(id1 = null) {
      this.id = id1;
      "coffee> new markings.Marking()\nMarking { id: null, d: Dict { indices: {}, itemlist: [], used: 0 } }\ncoffee> new markings.Marking(42)\nMarking { id: 42, d: Dict { indices: {}, itemlist: [], used: 0 } }";
      this.d = new dicts.Dict();
    }

    iter() {
      return this.d.iter();
    }

    hash() {
      "coffee> a = new markings.Marking()\ncoffee> a.set(\"p1\", 1, 2, 3)\ncoffee> a.set(\"p2\", 4, 5)\ncoffee> b = new markings.Marking()\ncoffee> b.set(\"p1\", 3, 1, 2)\ncoffee> b.set(\"p2\", 5, 4)\ncoffee> a.hash() == b.hash()\ntrue";
      var h, m, p, ref, x;
      h = 7028009221;
      ref = this.d.iter();
      for (x of ref) {
        [p, m] = x;
        h ^= (dicts.hash(p) << 5) + dicts.hash(m);
      }
      return h;
    }

    eq(other) {
      "coffee> a = new markings.Marking()\ncoffee> a.set(\"p1\", 1, 2, 3)\ncoffee> a.set(\"p2\", 4, 5)\ncoffee> b = new markings.Marking()\ncoffee> b.set(\"p1\", 3, 1, 2)\ncoffee> b.set(\"p2\", 5, 4)\ncoffee> a.eq(b)\ntrue";
      if (!(other instanceof Marking)) {
        return false;
      }
      return this.d.eq(other.d);
    }

    copy(id = null) {
      "coffee> a = new markings.Marking()\ncoffee> a.set(\"p1\", 1, 2, 3)\ncoffee> a.set(\"p2\", 4, 5)\ncoffee> a.copy().eq(a)\ncoffee> a.copy() is a\nfalse";
      var copy, m, p, ref, x;
      copy = new Marking(id);
      ref = this.iter();
      for (x of ref) {
        [p, m] = x;
        copy.set(p, m.copy());
      }
      return copy;
    }

    has(place) {
      "coffee> a = new markings.Marking()\ncoffee> a.set(\"p1\", 1, 2, 3)\ncoffee> a.set(\"p2\", 4, 5)\ncoffee> a.has(\"p1\")\ntrue\ncoffee> a.has(\"p3\")\nfalse";
      return this.d.has(place);
    }

    set(place, ...tokens) {
      "coffee> a = new markings.Marking()\ncoffee> a.set(\"p1\", 1, 2, 3)\ncoffee> console.log a.get(\"p1\").toString()\n[1, 2, 3]\ncoffee> a.set(\"p1\")\ncoffee> a.has(\"p1\")\nfalse";
      if (tokens.length === 0 && this.has(place)) {
        return this.d.del(place);
      } else {
        return this.d.set(place, new msets.Mset(...tokens));
      }
    }

    update(place, tokens) {
      "coffee> a = new markings.Marking()\ncoffee> a.set(\"p1\", 1, 2, 3)\ncoffee> a.set(\"p2\", 4, 5, 6)\ncoffee> a.update(\"p1\", a.get(\"p2\"))\ncoffee> console.log a.get(\"p1\").toString()\n[1, 2, 3, 4, 5, 6]";
      if (this.has(place)) {
        return this.d.get(place).add(tokens);
      } else {
        return this.d.set(place, tokens.copy());
      }
    }

    get(place) {
      "coffee> a = new markings.Marking()\ncoffee> a.set(\"p1\", 1, 2, 3)\ncoffee> console.log a.get(\"p1\").toString()\n[1, 2, 3]\ncoffee> console.log a.get(\"p2\").toString()\n[]";
      return this.d.get(place, new msets.Mset());
    }

    empty(place) {
      "coffee> a = new markings.Marking()\ncoffee> a.set(\"p1\", 1, 2, 3)\ncoffee> a.empty(\"p1\")\nfalse\ncoffee> a.empty(\"p2\")\ntrue";
      return this.get(place).empty();
    }

    add(other) {
      "coffee> a = new markings.Marking()\ncoffee> a.set(\"p1\", 1, 2, 3)\ncoffee> b = new markings.Marking()\ncoffee> b.set(\"p1\", 4)\ncoffee> b.set(\"p2\", 5, 6)\ncoffee> c = new markings.Marking()\ncoffee> c.set(\"p1\", 1, 2, 3, 4)\ncoffee> c.set(\"p2\", 5, 6)\ncoffee> a.add(b).eq(c)\ntrue";
      var m, p, ref, x;
      ref = other.iter();
      for (x of ref) {
        [p, m] = x;
        this.update(p, m);
      }
      return this;
    }

    sub(other) {
      "coffee> a = new markings.Marking()\ncoffee> a.set(\"p1\", 1, 2, 3)\ncoffee> b = new markings.Marking()\ncoffee> b.set(\"p1\", 2, 3)\ncoffee> b.set(\"p2\", 5)\ncoffee> c = new markings.Marking()\ncoffee> c.set(\"p1\", 1)\ncoffee> a.sub(b).eq(c)\ntrue";
      var m, mine, p, ref, x;
      ref = other.iter();
      for (x of ref) {
        [p, m] = x;
        mine = this.d.get(p, this);
        if (mine === this) {

        // skip
        } else if (m.geq(mine)) {
          this.d.del(p);
        } else {
          this.d.set(p, mine.sub(m));
        }
      }
      return this;
    }

    geq(other) {
      "coffee> a = new markings.Marking()\ncoffee> a.set(\"p1\", 1, 2, 3)\ncoffee> b = new markings.Marking()\ncoffee> b.set(\"p1\", 2, 3)\ncoffee> a.geq(b)\ntrue\ncoffee> b.set(\"p1\", 1, 2, 3)\ncoffee> a.geq(b)\ntrue\ncoffee> b.set(\"p1\", 1, 2, 3, 4)\ncoffee> b.get(\"p1\").d\ncoffee> a.geq(b)\nfalse\ncoffee> b.set(\"p1\", 1, 2, 3)\ncoffee> b.set(\"p2\", 4)\ncoffee> a.geq(b)\nfalse";
      var m, p, ref, x;
      ref = other.iter();
      for (x of ref) {
        [p, m] = x;
        if (!this.get(p).geq(m)) {
          return false;
        }
      }
      return true;
    }

    toString() {
      "coffee> a = new markings.Marking()\ncoffee> a.set(\"p1\", 1, 2, 3)\ncoffee> a.set(\"p2\", 3, 4)\ncoffee> console.log a.toString()\n{'p1': [1, 2, 3], 'p2': [3, 4]}";
      var items, m, p;
      items = (function() {
        var ref, results, x;
        ref = this.iter();
        results = [];
        for (x of ref) {
          [p, m] = x;
          results.push(`'${p}': ${m.toString()}`);
        }
        return results;
      }).call(this);
      return `{${items.join(', ')}}`;
    }

  };

  module.exports = {
    Marking: Marking
  };

}).call(this);

//# sourceMappingURL=markings.js.map