Throttle

Medium

Solution

export function throttle<T extends (...args: any[]) => void>(
  fn: T,
  t: number,
): (...args: Parameters<T>) => void {
  let pending = false;
  let nextArgs: Parameters<T> | undefined;
 
  const throttled = (...args: Parameters<T>) => {
    nextArgs = args;
 
    if (pending) {
      return;
    }
 
    fn(...args);
    pending = true;
    nextArgs = undefined;
    setTimeout(() => {
      pending = false;
      if (nextArgs) {
        throttled(...nextArgs);
      }
    }, t);
  };
 
  return throttled;
}