function createGraph()

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};
}