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