/** * Throttle function execution to a maximum frequency. * * @param fn Function to throttle. * @param wait Maximum time between function calls. * @returns Throttled function. */ export function throttle any>( fn: T, wait: number, ): (...args: Parameters) => void { let lastCall = 0; let timeoutId: ReturnType | null = null; return (...args: Parameters) => { const now = Date.now(); const timeSinceLastCall = now - lastCall; if (timeSinceLastCall >= wait) { lastCall = now; fn(...args); } else { // Schedule for end of wait period if (timeoutId) clearTimeout(timeoutId); timeoutId = setTimeout(() => { lastCall = Date.now(); fn(...args); timeoutId = null; }, wait - timeSinceLastCall); } }; }