export function debounce) => ReturnType>( fn: T, delay: number ): (...args: Parameters) => void { let timeout: ReturnType | undefined; return (...args: Parameters) => { if (timeout) { clearTimeout(timeout); } timeout = setTimeout(() => { fn(...args); }, delay); }; } export function throttle) => ReturnType>( fn: T, interval: number ): (...args: Parameters) => void { let lastTime = 0; let timeout: ReturnType | undefined; return (...args: Parameters) => { const now = Date.now(); const remaining = interval - (now - lastTime); if (remaining <= 0) { if (timeout) { clearTimeout(timeout); timeout = undefined; } lastTime = now; fn(...args); } else if (!timeout) { timeout = setTimeout(() => { lastTime = Date.now(); timeout = undefined; fn(...args); }, remaining); } }; }