You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
3.0 KiB
89 lines
3.0 KiB
'use strict'; |
|
|
|
// A [trie](https://en.wikipedia.org/wiki/Trie) data structure that holds |
|
// object keys weakly, yet can also hold non-object keys, unlike the |
|
// native `WeakMap`. |
|
// If no makeData function is supplied, the looked-up data will be an empty, |
|
// null-prototype Object. |
|
var defaultMakeData = function () { return Object.create(null); }; |
|
// Useful for processing arguments objects as well as arrays. |
|
var _a = Array.prototype, forEach = _a.forEach, slice = _a.slice; |
|
var hasOwnProperty = Object.prototype.hasOwnProperty; |
|
var Trie = /** @class */ (function () { |
|
function Trie(weakness, makeData) { |
|
if (weakness === void 0) { weakness = true; } |
|
if (makeData === void 0) { makeData = defaultMakeData; } |
|
this.weakness = weakness; |
|
this.makeData = makeData; |
|
} |
|
Trie.prototype.lookup = function () { |
|
return this.lookupArray(arguments); |
|
}; |
|
Trie.prototype.lookupArray = function (array) { |
|
var node = this; |
|
forEach.call(array, function (key) { return node = node.getChildTrie(key); }); |
|
return hasOwnProperty.call(node, "data") |
|
? node.data |
|
: node.data = this.makeData(slice.call(array)); |
|
}; |
|
Trie.prototype.peek = function () { |
|
return this.peekArray(arguments); |
|
}; |
|
Trie.prototype.peekArray = function (array) { |
|
var node = this; |
|
for (var i = 0, len = array.length; node && i < len; ++i) { |
|
var map = node.mapFor(array[i], false); |
|
node = map && map.get(array[i]); |
|
} |
|
return node && node.data; |
|
}; |
|
Trie.prototype.remove = function () { |
|
return this.removeArray(arguments); |
|
}; |
|
Trie.prototype.removeArray = function (array) { |
|
var data; |
|
if (array.length) { |
|
var head = array[0]; |
|
var map = this.mapFor(head, false); |
|
var child = map && map.get(head); |
|
if (child) { |
|
data = child.removeArray(slice.call(array, 1)); |
|
if (!child.data && !child.weak && !(child.strong && child.strong.size)) { |
|
map.delete(head); |
|
} |
|
} |
|
} |
|
else { |
|
data = this.data; |
|
delete this.data; |
|
} |
|
return data; |
|
}; |
|
Trie.prototype.getChildTrie = function (key) { |
|
var map = this.mapFor(key, true); |
|
var child = map.get(key); |
|
if (!child) |
|
map.set(key, child = new Trie(this.weakness, this.makeData)); |
|
return child; |
|
}; |
|
Trie.prototype.mapFor = function (key, create) { |
|
return this.weakness && isObjRef(key) |
|
? this.weak || (create ? this.weak = new WeakMap : void 0) |
|
: this.strong || (create ? this.strong = new Map : void 0); |
|
}; |
|
return Trie; |
|
}()); |
|
function isObjRef(value) { |
|
switch (typeof value) { |
|
case "object": |
|
if (value === null) |
|
break; |
|
// Fall through to return true... |
|
case "function": |
|
return true; |
|
} |
|
return false; |
|
} |
|
|
|
exports.Trie = Trie; |
|
//# sourceMappingURL=bundle.cjs.map
|
|
|