Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 1x 1x 1x | import { uniqueNodes, groupByComponents, getStartNodes, makeOutgoingEdges, makeIncomingEdges, } from './helpers.js';
import { validateEdges, validateArgs, validateDag } from './validators.js';
export function toposortExtra(opts) {
validateArgs(opts);
const nodes = opts.nodes || uniqueNodes(opts.edges);
const edges = opts.edges;
validateEdges(nodes, edges);
const prev = new Map([...makeIncomingEdges(edges)].map(([node, neighborsSet]) => [node, [...neighborsSet]]));
const next = new Map([...makeOutgoingEdges(edges)].map(([node, neighborsSet]) => [node, [...neighborsSet]]));
const sources = getStartNodes(edges);
if (opts.throwOnCycle) {
validateDag({ edges, nodes, outgoing: next });
}
return {
sources,
prev,
next,
graphs: groupByComponents({ edges })
.map(graphNodesSet => {
return {
nodes: [...graphNodesSet],
sources: sources.filter(node => graphNodesSet.has(node))
};
})
};
}
|