binomial-heap
Version:
No dependency binomial heap, compatible with typescript, can have custom compare function
85 lines (84 loc) • 4.34 kB
JavaScript
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;
};
;