UNPKG

binomial-heap

Version:

No dependency binomial heap, compatible with typescript, can have custom compare function

85 lines (84 loc) 4.34 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.heap = void 0; var comparators_1 = require("./comparators"); var traverseHelpers_1 = require("./traverseHelpers"); var mergeHelpers_1 = require("./mergeHelpers"); var promisify_1 = require("./promisify"); Array.prototype.heap = function (compare) { return exports.heap(this, compare); }; exports.heap = function (items, compare) { var minCarry = -1; var inputAnalysis = !compare ? comparators_1.typeComparisonAnalyzer(items) : 'string'; var trueCompare = (comparators_1.extendCompare(compare) || comparators_1.getDefaultComparator(inputAnalysis)); var heapImpl = { items: items.length > 0 ? items.reduce(function (p, c) { return mergeHelpers_1.mergeHeaps(p, [{ parent: null, item: c, children: [] }], trueCompare, function (min) { return minCarry = min; }); }, []) : [], compare: function (compareFunction) { var realCompare = comparators_1.extendCompare(compareFunction); heapImpl.compareFunction = realCompare; if (!comparators_1.sanityCheck(heapImpl.items, realCompare)) { heapImpl.items = mergeHelpers_1.failedMerge(heapImpl.items, realCompare, function (min) { return heapImpl.minimum = min; }); } return heapImpl; }, merge: function (withHeap, compare, disableSanityCheck) { var nextAnalysis = comparators_1.mergeComparators(heapImpl.kindOfCompare, withHeap.kindOfCompare); var nextCompare = comparators_1.extendCompare(compare) || comparators_1.getDefaultComparator(nextAnalysis); heapImpl.items = mergeHelpers_1.mergeFunctionImpl(heapImpl, withHeap.items, nextCompare, compare, disableSanityCheck || false); heapImpl.kindOfCompare = nextAnalysis; return heapImpl; }, compareFunction: trueCompare, minimum: minCarry, min: function () { return heapImpl.items[heapImpl.minimum] ? heapImpl.items[heapImpl.minimum].item : null; }, push: function (item, compare, disableSanityCheck) { heapImpl.items = mergeHelpers_1.mergeFunctionImpl(heapImpl, [{ parent: null, item: item, children: [] }], comparators_1.extendCompare(compare) || heapImpl.compareFunction, compare, disableSanityCheck || false); return heapImpl; }, equals: function (otherHeap) { return comparators_1.equality(heapImpl.items, otherHeap.items, heapImpl.compareFunction); }, pop: function () { if (heapImpl.items.length === 0) { return null; } var item = heapImpl.items[heapImpl.minimum].item; var roots = heapImpl.items[heapImpl.minimum].children; heapImpl.items = heapImpl.items.filter(function (_, i) { return heapImpl.minimum !== i; }); if (roots.length > 0) { roots.forEach(function (root) { return heapImpl.items = mergeHelpers_1.mergeFunctionImpl(heapImpl, [root], heapImpl.compareFunction, undefined, true); }); } else { traverseHelpers_1.readMin(heapImpl.items, heapImpl.compareFunction, function (min) { return heapImpl.minimum = min; }); } return item; }, delete: function (toSeek) { var _a = comparators_1.getIndex(heapImpl.items, toSeek, heapImpl.compareFunction) || [], sought = _a[0], index = _a[1]; if (sought && index !== undefined) { traverseHelpers_1.treeClimb(sought); heapImpl.minimum = index; return heapImpl.pop(); } return null; }, search: function (toSeek) { var sought = (comparators_1.getIndex(heapImpl.items, toSeek, heapImpl.compareFunction) || [])[0]; if (sought) { return sought.item; } return null; }, sort: function () { var acc = []; var popped = heapImpl.pop(); while (popped !== null) { acc.push(popped); popped = heapImpl.pop(); } return acc; }, promisify: function () { return promisify_1.promisifyHeap(heapImpl); }, kindOfCompare: inputAnalysis, }; return heapImpl; };