export function debounce void>( func: F, waitMilliseconds: number, immediate = false, ) { let timeoutId: ReturnType | undefined; return (...args: Parameters): void => { const doLater = () => { timeoutId = undefined; if (!immediate) { func(...args); } }; const shouldCallNow = immediate && timeoutId === undefined; if (timeoutId !== undefined) { clearTimeout(timeoutId); } timeoutId = setTimeout(doLater, waitMilliseconds); if (shouldCallNow) { func(...args); } }; }