topological-sort-group
Version:
Topological sorting and cycle detection. Optional grouping for parallel processing
37 lines • 1.23 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "default", {
enumerable: true,
get: function() {
return cycles;
}
});
function cycles(graph) {
var visited = {};
var marks = {};
var cycles = [];
function visit(key, ancestors) {
if (marks[key]) return cycles.push(ancestors.concat(key)); // found a cycle
if (visited[key]) return; // already visited
visited[key] = true;
// check for cycles from this key
marks[key] = true;
graph.edges(key).forEach(function(neighborKey) {
visit(neighborKey, ancestors.concat(key));
});
delete marks[key];
}
// check all keys
var keys = graph.keys();
while(keys.length > 0){
visit(keys[0], []);
// remove processed
keys = keys.filter(function(key) {
return !visited[key];
});
}
return cycles;
}
/* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }