function debounce(input, delay = 1000) {
return Generators.observe(notify => {
let timer = null;
let value;
function inputted() {
if (timer !== null) return;
notify(value = input.value);
timer = setTimeout(delayed, delay);
}
function delayed() {
timer = null;
if (value === input.value) return;
notify(value = input.value);
}
input.addEventListener("input", inputted), inputted();
return () => input.removeEventListener("input", inputted);
});
}