import { SerializableParam, atomFamily, selectorFamily, RecoilState, AtomFamilyOptions, } from 'recoil' export function initializableAtomFamily< T extends SerializableParam, P extends SerializableParam >( options: Omit, 'default'> ): (param: P, initialValue: T) => RecoilState { const baseAtom: (param: P) => RecoilState = atomFamily({ ...options, default: undefined, }) const evaluationSelector = selectorFamily({ key: `${options.key}::withInitialValue`, get: ({ param, initialValue }) => ({ get }) => get(baseAtom(param)) ?? initialValue, set: ({ param }) => ({ set }, newValue) => set(baseAtom(param), newValue), }) return (param, initialValue) => { return evaluationSelector({ param, initialValue }) } }