import { computed, isArray, isFunction, ObservableComputed, ObservableComputedTwoWay, ObservableReadable, } from '@legendapp/state'; import { useMemo, useRef } from 'react'; export function useComputed(compute: () => T | Promise): ObservableComputed; export function useComputed(compute: () => T | Promise, deps: any[]): ObservableComputed; export function useComputed( compute: (() => T | Promise) | ObservableReadable, set: (value: T2) => void, ): ObservableComputedTwoWay; export function useComputed( compute: (() => T | Promise) | ObservableReadable, set: (value: T2) => void, deps: any[], ): ObservableComputedTwoWay; export function useComputed( compute: (() => T | Promise) | ObservableReadable, set?: ((value: T2) => void) | any[], deps?: any[], ): ObservableComputed | ObservableComputedTwoWay { if (!deps && isArray(set)) { deps = set; set = undefined; } const ref = useRef<{ compute?: (() => T | Promise) | ObservableReadable; set?: (value: T2) => void }>({}); ref.current.compute = compute; ref.current.set = set as (value: T2) => void; return useMemo( () => computed( () => (isFunction(ref.current.compute) ? ref.current.compute() : ref.current.compute) as T, (set ? (value) => ref.current.set!(value) : undefined) as (value: T2) => void, ), deps || [], ); }