Throttle

Medium

Solution

// eslint-disable-next-line @typescript-eslint/no-explicit-any
export function throttle(fn: (...args: any[]) => void, t: number): (...args: any[]) => void {
  let timeoutId: NodeJS.Timeout | null = null;
  let delayed = 0;
  return (...args) => {
    if (timeoutId) {
      clearTimeout(timeoutId);
    }
    const delay = Math.max(0, delayed - Date.now());
    timeoutId = setTimeout(() => {
      fn(...args);
      delayed = Date.now() + t;
    }, delay);
  };
}