UNPKG

@bigtest/mirage

Version:

A client-side server to develop, test and prototype your app.

49 lines (41 loc) 1.08 kB
// jscs:disable disallowVar, requireArrayDestructuring import _uniq from 'lodash/uniq'; import _flatten from 'lodash/flatten'; export default function(edges) { let nodes = _uniq(_flatten(edges)); let cursor = nodes.length; let sorted = new Array(cursor); let visited = {}; let i = cursor; let visit = function(node, i, predecessors) { if (predecessors.indexOf(node) >= 0) { throw new Error(`Cyclic dependency in properties ${JSON.stringify(predecessors)}`); } if (visited[i]) { return; } else { visited[i] = true; } let outgoing = edges.filter(function(edge) { return edge && edge[0] === node; }); i = outgoing.length; if (i) { let preds = predecessors.concat(node); do { let pair = outgoing[--i]; let child = pair[1]; if (child) { visit(child, nodes.indexOf(child), preds); } } while (i); } sorted[--cursor] = node; }; while (i--) { if (!visited[i]) { visit(nodes[i], i, []); } } return sorted.reverse(); }