function initializeRetentionForNode()

in packages/recoil/core/Recoil_FunctionalCore.js [32:80]


function initializeRetentionForNode(
  store: Store,
  nodeKey: NodeKey,
  retainedBy: RetainedBy,
): () => void {
  if (!gkx('recoil_memory_managament_2020')) {
    return () => undefined;
  }
  const {nodesRetainedByZone} = store.getState().retention;

  function addToZone(zone: RetentionZone) {
    let set = nodesRetainedByZone.get(zone);
    if (!set) {
      nodesRetainedByZone.set(zone, (set = new Set()));
    }
    set.add(nodeKey);
  }

  if (retainedBy instanceof RetentionZone) {
    addToZone(retainedBy);
  } else if (Array.isArray(retainedBy)) {
    for (const zone of retainedBy) {
      addToZone(zone);
    }
  }

  return () => {
    if (!gkx('recoil_memory_managament_2020')) {
      return;
    }
    const {retention} = store.getState();

    function deleteFromZone(zone: RetentionZone) {
      const set = retention.nodesRetainedByZone.get(zone);
      set?.delete(nodeKey);
      if (set && set.size === 0) {
        retention.nodesRetainedByZone.delete(zone);
      }
    }

    if (retainedBy instanceof RetentionZone) {
      deleteFromZone(retainedBy);
    } else if (Array.isArray(retainedBy)) {
      for (const zone of retainedBy) {
        deleteFromZone(zone);
      }
    }
  };
}