export function debounce(fn: (args: A) => R, ms: number): [(args: A) => Promise, () => void] { let timer: NodeJS.Timeout; const debouncedFunc = (args: A): Promise => new Promise((resolve) => { if (timer) { clearTimeout(timer); } timer = setTimeout(() => { resolve(fn(args)); }, ms); }); const teardown = () => clearTimeout(timer); return [debouncedFunc, teardown]; }