{"version":3,"sources":["meteor://💻app/packages/ordered-dict/ordered_dict.js"],"names":["module","export","OrderedDict","element","key","value","next","prev","constructor","args","_dict","Object","create","_first","_last","_size","_stringify","shift","x","forEach","kv","putBefore","_k","empty","size","_linkEltIn","elt","_linkEltOut","item","before","Error","append","remove","get","has","prototype","hasOwnProperty","call","iter","context","i","b","BREAK","first","firstValue","last","lastValue","moveBefore","eltBefore","indexOf","ret","v","k","_checkRep","keys"],"mappings":"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","file":"/packages/ordered-dict.js","sourcesContent":["// This file defines an ordered dictionary abstraction that is useful for\n// maintaining a dataset backed by observeChanges. It supports ordering items\n// by specifying the item they now come before.\n\n// The implementation is a dictionary that contains nodes of a doubly-linked\n// list as its values.\n\n// constructs a new element struct\n// next and prev are whole elements, not keys.\nfunction element(key, value, next, prev) {\n return {\n key: key,\n value: value,\n next: next,\n prev: prev\n };\n}\n\nexport class OrderedDict {\n constructor(...args) {\n this._dict = Object.create(null);\n this._first = null;\n this._last = null;\n this._size = 0;\n\n if (typeof args[0] === 'function') {\n this._stringify = args.shift();\n } else {\n this._stringify = function (x) { return x; };\n }\n\n args.forEach(kv => this.putBefore(kv[0], kv[1], null));\n }\n\n // the \"prefix keys with a space\" thing comes from here\n // https://github.com/documentcloud/underscore/issues/376#issuecomment-2815649\n _k(key) {\n return \" \" + this._stringify(key);\n }\n\n empty() {\n return !this._first;\n }\n\n size() {\n return this._size;\n }\n\n _linkEltIn(elt) {\n if (!elt.next) {\n elt.prev = this._last;\n if (this._last)\n this._last.next = elt;\n this._last = elt;\n } else {\n elt.prev = elt.next.prev;\n elt.next.prev = elt;\n if (elt.prev)\n elt.prev.next = elt;\n }\n if (this._first === null || this._first === elt.next)\n this._first = elt;\n }\n\n _linkEltOut(elt) {\n if (elt.next)\n elt.next.prev = elt.prev;\n if (elt.prev)\n elt.prev.next = elt.next;\n if (elt === this._last)\n this._last = elt.prev;\n if (elt === this._first)\n this._first = elt.next;\n }\n\n putBefore(key, item, before) {\n if (this._dict[this._k(key)])\n throw new Error(\"Item \" + key + \" already present in OrderedDict\");\n var elt = before ?\n element(key, item, this._dict[this._k(before)]) :\n element(key, item, null);\n if (typeof elt.next === \"undefined\")\n throw new Error(\"could not find item to put this one before\");\n this._linkEltIn(elt);\n this._dict[this._k(key)] = elt;\n this._size++;\n }\n\n append(key, item) {\n this.putBefore(key, item, null);\n }\n\n remove(key) {\n var elt = this._dict[this._k(key)];\n if (typeof elt === \"undefined\")\n throw new Error(\"Item \" + key + \" not present in OrderedDict\");\n this._linkEltOut(elt);\n this._size--;\n delete this._dict[this._k(key)];\n return elt.value;\n }\n\n get(key) {\n if (this.has(key)) {\n return this._dict[this._k(key)].value;\n }\n }\n\n has(key) {\n return Object.prototype.hasOwnProperty.call(\n this._dict,\n this._k(key)\n );\n }\n\n // Iterate through the items in this dictionary in order, calling\n // iter(value, key, index) on each one.\n\n // Stops whenever iter returns OrderedDict.BREAK, or after the last element.\n forEach(iter, context = null) {\n var i = 0;\n var elt = this._first;\n while (elt !== null) {\n var b = iter.call(context, elt.value, elt.key, i);\n if (b === OrderedDict.BREAK) return;\n elt = elt.next;\n i++;\n }\n }\n\n first() {\n if (this.empty()) {\n return;\n }\n return this._first.key;\n }\n\n firstValue() {\n if (this.empty()) {\n return;\n }\n return this._first.value;\n }\n\n last() {\n if (this.empty()) {\n return;\n }\n return this._last.key;\n }\n\n lastValue() {\n if (this.empty()) {\n return;\n }\n return this._last.value;\n }\n\n prev(key) {\n if (this.has(key)) {\n var elt = this._dict[this._k(key)];\n if (elt.prev)\n return elt.prev.key;\n }\n return null;\n }\n\n next(key) {\n if (this.has(key)) {\n var elt = this._dict[this._k(key)];\n if (elt.next)\n return elt.next.key;\n }\n return null;\n }\n\n moveBefore(key, before) {\n var elt = this._dict[this._k(key)];\n var eltBefore = before ? this._dict[this._k(before)] : null;\n if (typeof elt === \"undefined\") {\n throw new Error(\"Item to move is not present\");\n }\n if (typeof eltBefore === \"undefined\") {\n throw new Error(\"Could not find element to move this one before\");\n }\n if (eltBefore === elt.next) // no moving necessary\n return;\n // remove from its old place\n this._linkEltOut(elt);\n // patch into its new place\n elt.next = eltBefore;\n this._linkEltIn(elt);\n }\n\n // Linear, sadly.\n indexOf(key) {\n var ret = null;\n this.forEach((v, k, i) => {\n if (this._k(k) === this._k(key)) {\n ret = i;\n return OrderedDict.BREAK;\n }\n return;\n });\n return ret;\n }\n\n _checkRep() {\n Object.keys(this._dict).forEach(k => {\n const v = this._dict[k];\n if (v.next === v) {\n throw new Error(\"Next is a loop\");\n }\n if (v.prev === v) {\n throw new Error(\"Prev is a loop\");\n }\n });\n }\n}\n\nOrderedDict.BREAK = {\"break\": true};\n"]}