export function debounce Promise>(fn: T, delay: number) { let timeoutId: ReturnType | null = null; const debounced = (...args: Parameters): Promise => new Promise((resolve, reject) => { if (timeoutId) { clearTimeout(timeoutId); } timeoutId = setTimeout(async () => { try { const result = await fn(...args); resolve(result); } catch (error) { reject(error); } }, delay); }); debounced.cancel = () => { if (timeoutId) { clearTimeout(timeoutId); timeoutId = null; } }; return debounced; }