import type { Signal } from '../util/signals'; import useThrottledCallback from './useThrottledCallback'; import useDebouncedCallback from './useDebouncedCallback'; import useDerivedSignal from './useDerivedSignal'; export function useThrottledResolver(resolver: () => T, deps: any[], ms: number, noFirst = false) { return useThrottledCallback((setValue: (newValue: T) => void) => { setValue(resolver()); // eslint-disable-next-line react-hooks-static-deps/exhaustive-deps }, deps, ms, noFirst); } 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, ); }