diff --git a/src/shared/lib/utils/throttle/throttle.ts b/src/shared/lib/utils/throttle/throttle.ts new file mode 100644 index 0000000..4bb0c90 --- /dev/null +++ b/src/shared/lib/utils/throttle/throttle.ts @@ -0,0 +1,32 @@ +/** + * 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); + } + }; +}