@dagrejs/dagre
Version:
Graph layout for JavaScript
57 lines (47 loc) • 1.32 kB
JavaScript
let util = require("../util");
module.exports = sort;
function sort(entries, biasRight) {
let parts = util.partition(entries, entry => {
return Object.hasOwn(entry, "barycenter");
});
let sortable = parts.lhs,
unsortable = parts.rhs.sort((a, b) => b.i - a.i),
vs = [],
sum = 0,
weight = 0,
vsIndex = 0;
sortable.sort(compareWithBias(!!biasRight));
vsIndex = consumeUnsortable(vs, unsortable, vsIndex);
sortable.forEach(entry => {
vsIndex += entry.vs.length;
vs.push(entry.vs);
sum += entry.barycenter * entry.weight;
weight += entry.weight;
vsIndex = consumeUnsortable(vs, unsortable, vsIndex);
});
let result = { vs: vs.flat(true) };
if (weight) {
result.barycenter = sum / weight;
result.weight = weight;
}
return result;
}
function consumeUnsortable(vs, unsortable, index) {
let last;
while (unsortable.length && (last = unsortable[unsortable.length - 1]).i <= index) {
unsortable.pop();
vs.push(last.vs);
index++;
}
return index;
}
function compareWithBias(bias) {
return (entryV, entryW) => {
if (entryV.barycenter < entryW.barycenter) {
return -1;
} else if (entryV.barycenter > entryW.barycenter) {
return 1;
}
return !bias ? entryV.i - entryW.i : entryW.i - entryV.i;
};
}