/* eslint-disable @typescript-eslint/no-explicit-any */ import { atom } from 'jotai/vanilla'; import type { SetStateAction, WritableAtom } from 'jotai/vanilla'; import * as O from 'optics-ts'; const getCached = (c: () => T, m: WeakMap, k: object): T => (m.has(k) ? m : m.set(k, c())).get(k) as T; const cache1 = new WeakMap(); const memo2 = (create: () => T, dep1: object, dep2: object): T => { const cache2 = getCached(() => new WeakMap(), cache1, dep1); return getCached(create, cache2, dep2); }; const isFunction = (x: T): x is T & ((...args: any[]) => any) => typeof x === 'function'; type NonFunction = [T] extends [(...args: any[]) => any] ? never : T; // Pattern 1: Promise export function focusAtom( baseAtom: WritableAtom, [Promise], R>, callback: (optic: O.OpticFor_) => O.Prism, ): WritableAtom, [SetStateAction], R>; export function focusAtom( baseAtom: WritableAtom, [Promise], R>, callback: (optic: O.OpticFor_) => O.Traversal, ): WritableAtom, [SetStateAction], R>; export function focusAtom( baseAtom: WritableAtom, [Promise], R>, callback: ( optic: O.OpticFor_, ) => O.Lens | O.Equivalence | O.Iso, ): WritableAtom, [SetStateAction], R>; // Pattern 2: Promise with undefined type export function focusAtom( baseAtom: WritableAtom, [Promise], R>, callback: (optic: O.OpticFor_) => O.Prism, ): WritableAtom, [SetStateAction], R>; export function focusAtom( baseAtom: WritableAtom, [Promise], R>, callback: (optic: O.OpticFor_) => O.Traversal, ): WritableAtom, [SetStateAction], R>; export function focusAtom( baseAtom: WritableAtom, [Promise], R>, callback: ( optic: O.OpticFor_, ) => O.Lens | O.Equivalence | O.Iso, ): WritableAtom, [SetStateAction], R>; // Pattern 3: Default export function focusAtom( baseAtom: WritableAtom], R>, callback: (optic: O.OpticFor_) => O.Prism, ): WritableAtom], R>; export function focusAtom( baseAtom: WritableAtom], R>, callback: (optic: O.OpticFor_) => O.Traversal, ): WritableAtom], R>; export function focusAtom( baseAtom: WritableAtom], R>, callback: ( optic: O.OpticFor_, ) => O.Lens | O.Equivalence | O.Iso, ): WritableAtom], R>; // Pattern 4: Default with undefined type export function focusAtom( baseAtom: WritableAtom], R>, callback: (optic: O.OpticFor_) => O.Prism, ): WritableAtom], R>; export function focusAtom( baseAtom: WritableAtom], R>, callback: (optic: O.OpticFor_) => O.Traversal, ): WritableAtom], R>; export function focusAtom( baseAtom: WritableAtom], R>, callback: ( optic: O.OpticFor_, ) => O.Lens | O.Equivalence | O.Iso, ): WritableAtom], R>; // Implementation export function focusAtom( baseAtom: WritableAtom], R>, callback: ( optic: O.OpticFor_, ) => | O.Lens | O.Equivalence | O.Iso | O.Prism | O.Traversal, ) { return memo2( () => { const focus = callback(O.optic()); const derivedAtom = atom( (get) => { const base = get(baseAtom); return base instanceof Promise ? base.then((v) => getValueUsingOptic(focus, v)) : getValueUsingOptic(focus, base); }, (get, set, update: SetStateAction) => { const newValueProducer = isFunction(update) ? O.modify(focus)(update) : O.set(focus)(update); const base = get(baseAtom); return set( baseAtom, (base instanceof Promise ? base.then(newValueProducer) : newValueProducer(base)) as NonFunction, ); }, ); return derivedAtom; }, baseAtom, callback, ); } const getValueUsingOptic = ( focus: | O.Lens | O.Equivalence | O.Iso | O.Prism | O.Traversal, bigValue: S, ) => { if (focus._tag === 'Traversal') { const values = O.collect(focus)(bigValue); return values; } if (focus._tag === 'Prism') { const value = O.preview(focus)(bigValue); return value; } const value = O.get(focus)(bigValue); return value; };