UNPKG

pertain

Version:

Automated pub/sub across project dependencies. Run code from any installed package based on declarative rules in package.json

58 lines 4.16 kB
import PertainError from './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. */ export default class TopologicalSorter { outgoingFrom; 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(`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; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVG9wb2xvZ2ljYWxTb3J0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvVG9wb2xvZ2ljYWxTb3J0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxZQUFZLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsb0JBQW9CO0FBRXBCOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8saUJBQWlCO0lBQzVCLFlBQVksQ0FBbUI7SUFDdkMsWUFBWSxZQUE4QjtRQUN4QyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztJQUNuQyxDQUFDO0lBQ00sSUFBSSxDQUFDLEtBQVU7UUFDcEIsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUMxQixNQUFNLE1BQU0sR0FBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QyxNQUFNLE9BQU8sR0FBK0IsRUFBRSxDQUFDO1FBQy9DLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUNmLHFEQUFxRDtRQUNyRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTVDLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFFOUIsT0FBTyxDQUFDLEVBQUUsRUFBRTtZQUNWLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztTQUNoRDtRQUVELE9BQU8sTUFBTSxDQUFDO1FBRWQsU0FBUyxLQUFLLENBQUMsSUFBTyxFQUFFLENBQVMsRUFBRSxZQUFvQjtZQUNyRCxJQUFJLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzFCLE1BQU0sSUFBSSxZQUFZLENBQUMsd0JBQXdCLElBQUksRUFBRSxDQUFDLENBQUM7YUFDeEQ7WUFFRCxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQUUsT0FBTztZQUN2QixPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBRWxCLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUVwQyxJQUFJLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDekIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdkIsR0FBRztvQkFDRCxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDMUIsS0FBSyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDO2lCQUM1RCxRQUFRLENBQUMsRUFBRTtnQkFDWixZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzNCO1lBRUQsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQzFCLENBQUM7SUFDSCxDQUFDO0lBQ08sYUFBYSxDQUFDLEdBQVE7UUFDNUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQWEsQ0FBQztRQUNqQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzlDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3BCO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0NBQ0YifQ==