12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- exports = function(edges) {
- return sort(uniqueNodes(edges), edges);
- };
- function uniqueNodes(arr) {
- var ret = [];
- for (var i = 0, len = arr.length; i < len; i++) {
- var edge = arr[i];
- if (ret.indexOf(edge[0]) < 0) ret.push(edge[0]);
- if (ret.indexOf(edge[1]) < 0) ret.push(edge[1]);
- }
- return ret;
- }
- function sort(nodes, edges) {
- var cursor = nodes.length;
- var sorted = new Array(cursor);
- var visited = {};
- var i = cursor;
- while (i--) {
- if (!visited[i]) visit(nodes[i], i, []);
- }
- function visit(node, i, predecessors) {
- if (predecessors.indexOf(node) >= 0) {
- throw new Error('Cyclic dependency: ' + JSON.stringify(node));
- }
- if (visited[i]) return;
- visited[i] = true;
- var outgoing = edges.filter(function(edge) {
- return edge[0] === node;
- });
- if ((i = outgoing.length)) {
- var preds = predecessors.concat(node);
- do {
- var child = outgoing[--i][1];
- visit(child, nodes.indexOf(child), preds);
- } while (i);
- }
- sorted[--cursor] = node;
- }
- return sorted;
- }
- module.exports = exports;
|