function mergeDependencyMapIntoGraph()

in packages/recoil/core/Recoil_Graph.js [43:94]


function mergeDependencyMapIntoGraph(
  deps: DependencyMap,
  graph: Graph,
  // If olderGraph is given then we will not overwrite changes made to the given
  // graph compared with olderGraph:
  olderGraph?: Graph,
): void {
  const {nodeDeps, nodeToNodeSubscriptions} = graph;

  deps.forEach((upstreams, downstream) => {
    const existingUpstreams = nodeDeps.get(downstream);

    if (
      existingUpstreams &&
      olderGraph &&
      existingUpstreams !== olderGraph.nodeDeps.get(downstream)
    ) {
      return;
    }

    // Update nodeDeps:
    nodeDeps.set(downstream, new Set(upstreams));

    // Add new deps to nodeToNodeSubscriptions:
    const addedUpstreams =
      existingUpstreams == null
        ? upstreams
        : differenceSets(upstreams, existingUpstreams);
    addedUpstreams.forEach(upstream => {
      if (!nodeToNodeSubscriptions.has(upstream)) {
        nodeToNodeSubscriptions.set(upstream, new Set());
      }
      const existing = nullthrows(nodeToNodeSubscriptions.get(upstream));
      existing.add(downstream);
    });

    // Remove removed deps from nodeToNodeSubscriptions:
    if (existingUpstreams) {
      const removedUpstreams = differenceSets(existingUpstreams, upstreams);
      removedUpstreams.forEach(upstream => {
        if (!nodeToNodeSubscriptions.has(upstream)) {
          return;
        }
        const existing = nullthrows(nodeToNodeSubscriptions.get(upstream));
        existing.delete(downstream);
        if (existing.size === 0) {
          nodeToNodeSubscriptions.delete(upstream);
        }
      });
    }
  });
}