in packages/recoil/core/Recoil_RecoilValueInterface.js [132:173]
function applyAction(store: Store, state: TreeState, action: Action<mixed>) {
if (action.type === 'set') {
const {recoilValue, valueOrUpdater} = action;
const newValue = valueFromValueOrUpdater(
store,
state,
recoilValue,
valueOrUpdater,
);
const writes = setNodeValue(store, state, recoilValue.key, newValue);
for (const [key, loadable] of writes.entries()) {
writeLoadableToTreeState(state, key, loadable);
}
} else if (action.type === 'setLoadable') {
const {
recoilValue: {key},
loadable,
} = action;
writeLoadableToTreeState(state, key, loadable);
} else if (action.type === 'markModified') {
const {
recoilValue: {key},
} = action;
state.dirtyAtoms.add(key);
} else if (action.type === 'setUnvalidated') {
// Write value directly to state bypassing the Node interface as the node
// definitions may not have been loaded yet when processing the initial snapshot.
const {
recoilValue: {key},
unvalidatedValue,
} = action;
const node = getNodeMaybe(key);
node?.invalidate?.(state);
state.atomValues.delete(key);
state.nonvalidatedAtoms.set(key, unvalidatedValue);
state.dirtyAtoms.add(key);
} else {
recoverableViolation(`Unknown action ${action.type}`, 'recoil');
}
}