UNPKG

@thi.ng/arrays

Version:

Array / Arraylike utilities

22 lines (21 loc) 589 B
import { assert } from "@thi.ng/errors/assert"; const topoSort = (nodes, deps) => { const cycles = {}; const topology = []; const sort = (id, path) => { assert(nodes[id] != null, `missing node: ${id}`); assert(!cycles[id], `dependency cycle: ${path.join(" -> ")}`); cycles[id] = true; const nodeDeps = deps(nodes[id], id); if (nodeDeps) { for (let d of nodeDeps) sort(d, [...path, d]); } cycles[id] = false; if (!topology.includes(id)) topology.push(id); }; for (let id in nodes) sort(id, [id]); return topology; }; export { topoSort };