Debounce utility
Delays execution until a quiet period has elapsed.
import { describe, it, expect, vi } from 'vitest'import { debounce } from './debounce'
describe('debounce', () => { it('delays the callback', () => { vi.useFakeTimers() const fn = vi.fn() const debounced = debounce(fn, 100) debounced() expect(fn).not.toHaveBeenCalled() vi.advanceTimersByTime(100) expect(fn).toHaveBeenCalledOnce() vi.useRealTimers() })})export function debounce<T extends (...args: unknown[]) => void>( fn: T, ms: number,): (...args: Parameters<T>) => void { let timer: ReturnType<typeof setTimeout> return (...args) => { clearTimeout(timer) timer = setTimeout(() => fn(...args), ms) }}