import type { Signal } from '../util/signals'; import type { Scheduler } from '../util/schedulers'; import useThrottledCallback from './useThrottledCallback'; import useDebouncedCallback from './useDebouncedCallback'; import useDerivedSignal from './useDerivedSignal'; export function useThrottledResolver( resolver: () => T, deps: any[], msOrSchedulerFn: number | Scheduler, noFirst = false, ) { return useThrottledCallback((setValue: (newValue: T) => void) => { setValue(resolver()); // eslint-disable-next-line react-hooks-static-deps/exhaustive-deps }, deps, msOrSchedulerFn, noFirst); } export function useThrottledSignal( getValue: Signal, ms: number, noFirst = false, ): Signal { const throttledResolver = useThrottledResolver(() => getValue(), [getValue], ms, noFirst); return useDerivedSignal( throttledResolver, [throttledResolver, getValue], true, ); } export function useDebouncedResolver( resolver: () => T, deps: any[], ms: number, noFirst = false, noLast = false, ) { return useDebouncedCallback((setValue: (newValue: T) => void) => { setValue(resolver()); // eslint-disable-next-line react-hooks-static-deps/exhaustive-deps }, deps, ms, noFirst, noLast); } export function useDebouncedSignal( getValue: Signal, ms: number, noFirst = false, noLast = false, ): Signal { const debouncedResolver = useDebouncedResolver(() => getValue(), [getValue], ms, noFirst, noLast); return useDerivedSignal( debouncedResolver, [debouncedResolver, getValue], true, ); }