/* https://codeburst.io/throttling-and-debouncing-in-javascript-b01cad5c8edf */ export function throttle any>( func: T, limit: number, ): (...args: Parameters) => void { let lastFunc: ReturnType | undefined; let lastRan: number | undefined; return function (this: unknown, ...args: Parameters) { if (lastRan === undefined) { func.apply(this, args); lastRan = Date.now(); } else { if (lastFunc !== undefined) { clearTimeout(lastFunc); } lastFunc = setTimeout(() => { if (Date.now() - (lastRan as number) >= limit) { func.apply(this, args); lastRan = Date.now(); } }, limit - (Date.now() - (lastRan as number))); } }; }