/**
 * Utilitaire de debounce partage.
 *
 * Retarde l'execution d'une fonction : chaque appel reset un timer et
 * l'execution reelle n'a lieu qu'apres `delay` ms sans nouvelle invocation.
 * Utile pour eviter un spam d'appels reseau sur un champ de recherche
 * (une requete par touche -> une seule requete apres la derniere frappe).
 */
export function debounce<T extends (...args: never[]) => void>(fn: T, delay: number): T {
    let timer: ReturnType<typeof setTimeout> | null = null
    return ((...args: Parameters<T>) => {
        if (null !== timer) clearTimeout(timer)
        timer = setTimeout(() => fn(...args), delay)
    }) as T
}
