import type { Observable } from '@legendapp/state'; import { isFunction } from '@legendapp/state'; import type { Dispatch, DispatchWithoutAction, Reducer, ReducerAction, ReducerState, ReducerStateWithoutAction, ReducerWithoutAction, } from 'react'; import { useObservable } from './useObservable'; export function useObservableReducer, I>( reducer: R, initializerArg: I, initializer: (arg: I) => ReducerStateWithoutAction, ): [Observable>, DispatchWithoutAction]; export function useObservableReducer>( reducer: R, initializerArg: ReducerStateWithoutAction, initializer?: undefined, ): [Observable>, DispatchWithoutAction]; export function useObservableReducer, I>( reducer: R, initializerArg: I & ReducerState, initializer: (arg: I & ReducerState) => ReducerState, ): [Observable>, Dispatch>]; export function useObservableReducer, I>( reducer: R, initializerArg: I, initializer: (arg: I) => ReducerState, ): [Observable>, Dispatch>]; export function useObservableReducer>( reducer: R, initialState: ReducerState, initializer?: undefined, ): [Observable>, Dispatch>]; export function useObservableReducer, I>( reducer: R, initializerArg: I & ReducerState, initializer: ((arg: I & ReducerState) => ReducerState) | undefined, ): [Observable>, Dispatch>] { const obs = useObservable(() => initializerArg !== undefined && isFunction(initializerArg) ? initializer!(initializerArg) : initializerArg, ); const dispatch = (action: any) => { obs.set(reducer(obs.get(), action)); }; return [obs, dispatch]; }