import { produce, nothing } from 'immer'; import type { Draft } from 'immer'; import { atom } from 'jotai/vanilla'; import type { WritableAtom } from 'jotai/vanilla'; export function atomWithImmer( initialValue: Value, ): WritableAtom) => void)], void> { const anAtom: WritableAtom< Value, [Value | ((draft: Draft) => void)], void > = atom( initialValue, (get, set, fn: Value | ((draft: Draft) => void)) => set( anAtom, produce( get(anAtom), typeof fn === 'function' ? (fn as (draft: Draft) => void) : () => (fn === undefined ? nothing : fn), ), ), ); return anAtom; }