shawnmcknight/react-scrollbar-size

View on GitHub
src/utils/debounce.ts

Summary

Maintainability
A
0 mins
Test Coverage
// eslint-disable-next-line @typescript-eslint/no-explicit-any
interface DebouncedFn<F extends (...args: any[]) => void> {
    (...args: Parameters<F>): void;
    cancel: () => void;
}

// eslint-disable-next-line @typescript-eslint/no-explicit-any
const debounce = <F extends (...args: any[]) => void>(fn: F, waitFor: number): DebouncedFn<F> => {
    let timeout: NodeJS.Timeout | null;

    const clear = () => {
        if (timeout != null) {
            clearTimeout(timeout);
            timeout = null;
        }
    };

    const debouncedFn = (...args: Parameters<F>): void => {
        clear();

        timeout = setTimeout(() => {
            fn(...args);
        }, waitFor);
    };

    debouncedFn.cancel = () => {
        clear();
    };

    return debouncedFn;
};

export default debounce;