pertain
Version:
Automated pub/sub across project dependencies. Run code from any installed package based on declarative rules in package.json
63 lines • 4.37 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const PertainError_1 = __importDefault(require("./PertainError"));
/* eslint-disable */
/**
* Topologically sort a list of items of any type, given a list of items and
* a map of outward relations between those items. (Could be a function, but
* it's a class for testability.)
*
* Credit to https://github.com/marcelklehr/toposort/ for a great
* implementation I had to adapt to be faster for our particular use case.
*
* That code appears here courtesy of the MIT license.
*/
class TopologicalSorter {
constructor(outgoingFrom) {
this.outgoingFrom = outgoingFrom;
}
sort(nodes) {
let cursor = nodes.length;
const sorted = new Array(cursor);
const visited = {};
let i = cursor;
// Better data structures make algorithm much faster.
const nodesHash = this.makeNodesHash(nodes);
const { outgoingFrom } = this;
while (i--) {
if (!visited[i])
visit(nodes[i], i, new Set());
}
return sorted;
function visit(node, i, predecessors) {
if (predecessors.has(node)) {
throw new PertainError_1.default(`Cyclic dependency on ${node}`);
}
if (visited[i])
return;
visited[i] = true;
const outgoing = outgoingFrom(node);
if ((i = outgoing.length)) {
predecessors.add(node);
do {
let child = outgoing[--i];
visit(child, nodesHash.get(child), predecessors);
} while (i);
predecessors.delete(node);
}
sorted[--cursor] = node;
}
}
makeNodesHash(arr) {
const res = new Map();
for (let i = 0, len = arr.length; i < len; i++) {
res.set(arr[i], i);
}
return res;
}
}
exports.default = TopologicalSorter;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVG9wb2xvZ2ljYWxTb3J0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvVG9wb2xvZ2ljYWxTb3J0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrRUFBMEM7QUFDMUMsb0JBQW9CO0FBRXBCOzs7Ozs7Ozs7R0FTRztBQUNILE1BQXFCLGlCQUFpQjtJQUVwQyxZQUFZLFlBQThCO1FBQ3hDLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0lBQ25DLENBQUM7SUFDTSxJQUFJLENBQUMsS0FBVTtRQUNwQixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQzFCLE1BQU0sTUFBTSxHQUFRLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sT0FBTyxHQUErQixFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQ2YscURBQXFEO1FBQ3JELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFNUMsTUFBTSxFQUFFLFlBQVksRUFBRSxHQUFHLElBQUksQ0FBQztRQUU5QixPQUFPLENBQUMsRUFBRSxFQUFFO1lBQ1YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1NBQ2hEO1FBRUQsT0FBTyxNQUFNLENBQUM7UUFFZCxTQUFTLEtBQUssQ0FBQyxJQUFPLEVBQUUsQ0FBUyxFQUFFLFlBQW9CO1lBQ3JELElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDMUIsTUFBTSxJQUFJLHNCQUFZLENBQUMsd0JBQXdCLElBQUksRUFBRSxDQUFDLENBQUM7YUFDeEQ7WUFFRCxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQUUsT0FBTztZQUN2QixPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBRWxCLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUVwQyxJQUFJLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDekIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdkIsR0FBRztvQkFDRCxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDMUIsS0FBSyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDO2lCQUM1RCxRQUFRLENBQUMsRUFBRTtnQkFDWixZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzNCO1lBRUQsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQzFCLENBQUM7SUFDSCxDQUFDO0lBQ08sYUFBYSxDQUFDLEdBQVE7UUFDNUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQWEsQ0FBQztRQUNqQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzlDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3BCO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0NBQ0Y7QUFsREQsb0NBa0RDIn0=