export function validatedDebounce void>( callback: T, valueGetter: () => any, delay: number ): T & { reset: T } { let timer: ReturnType | undefined; let result = function (...args: Parameters) { clearTimeout(timer); let prev = valueGetter(); timer = setTimeout(function () { let now = valueGetter(); if (prev !== now) return; callback(...args); }, delay); } as T & { reset: T }; result.reset = function reset(...args: Parameters) { clearTimeout(timer); callback(...args); } as T; return result; }