/** * Utilidades para debounce e throttle */ export function debounce any>( func: T, delay: number ): (...args: Parameters) => void { let timeoutId: NodeJS.Timeout; return (...args: Parameters) => { clearTimeout(timeoutId); timeoutId = setTimeout(() => func(...args), delay); }; } export function throttle any>( func: T, delay: number ): (...args: Parameters) => void { let lastCall = 0; return (...args: Parameters) => { const now = Date.now(); if (now - lastCall >= delay) { lastCall = now; func(...args); } }; } // Request cancellation manager export class RequestManager { private controllers = new Map(); // Cancelar request anterior e criar novo createRequest(key: string): AbortController { const existing = this.controllers.get(key); if (existing) { existing.abort(); } const controller = new AbortController(); this.controllers.set(key, controller); return controller; } // Cancelar request específico cancelRequest(key: string): void { const controller = this.controllers.get(key); if (controller) { controller.abort(); this.controllers.delete(key); } } // Cancelar todos os requests cancelAllRequests(): void { this.controllers.forEach(controller => { controller.abort(); }); this.controllers.clear(); } // Verificar se request está ativo isActive(key: string): boolean { const controller = this.controllers.get(key); return Boolean(controller && !controller.signal.aborted); } }