function viewroutine(generator) {
let current;
const holder = Object.defineProperty(
document.createElement("span"),
"value",
{
get: () => current?.value,
set: (v) => (current ? (current.value = v) : null),
enumerable: true
}
);
new Promise(async () => {
const iterator = generator();
const n = await iterator.next();
let { done, value } = n;
while (!done) {
if (value instanceof Event) {
holder.dispatchEvent(value);
} else {
current = value;
if (holder.firstChild) holder.removeChild(holder.firstChild);
if (value) {
holder.appendChild(value);
}
}
({ done, value } = await iterator.next());
}
holder.remove();
});
return holder;
}