All files / libs debounce.ts

88.23% Statements 15/17
60% Branches 6/10
100% Functions 4/4
93.33% Lines 14/15

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39                      49x   2000x   2000x 2000x 2x 2x   2000x   2000x 1998x   2000x   2000x     49x 24x         49x    
interface CallableFunction {
  apply<T, R>(thisArg: T, args: IArguments): R;
}
 
export default function debounce(
  func: CallableFunction,
  wait: number,
  immediate?: boolean,
): { (this: HTMLElement): void; clear(): void } {
  let timeout: ReturnType<typeof setTimeout> | null;
 
  const debounced = function (this: HTMLElement) {
    // eslint-disable-next-line @typescript-eslint/no-this-alias
    const context = this;
    // eslint-disable-next-line prefer-rest-params
    const args = arguments;
    const later = function () {
      timeout = null;
      Eif (!immediate) func.apply(context, args);
    };
    const callNow = immediate && !timeout;
 
    if (timeout) {
      clearTimeout(timeout);
    }
    timeout = setTimeout(later, wait);
 
    Iif (callNow) func.apply(context, args);
  };
 
  debounced.clear = function () {
    Iif (timeout) {
      clearTimeout(timeout);
    }
  };
 
  return debounced;
}