in packages-ext/recoil-devtools/src/utils/GraphUtils.js [39:91]
function createGraph(deps: DependenciesSnapshotType): {
// TODO: define proper types
levels: $ReadOnlyArray<$ReadOnlyArray<string>>,
edges: $ReadOnlyArray<mixed>,
} {
const nodes = new Map();
const edges = [];
const levels = [[]];
let queue = Object.keys(deps);
let solved;
let it = 0;
do {
it++;
solved = 0;
const newQueue = [];
for (const key of queue) {
const blockers = deps[key];
let add = true;
let level = 0;
const links = [];
for (const blocker of blockers) {
if (nodes.has(blocker)) {
const info = nodes.get(blocker);
level = Math.max(level, nullthrows(info)[0] + 1);
links.push(info);
} else {
add = false;
break;
}
}
if (add) {
if (!levels[level]) {
levels[level] = [];
}
const coors = [level, levels[level].length];
nodes.set(key, coors);
levels[level].push(key);
links.forEach(link => {
edges.push([link, coors]);
});
solved++;
} else {
newQueue.push(key);
}
}
queue = newQueue;
} while (solved > 0 && queue.length && it < 10);
return {levels, edges};
}