ifVisible = async function*(dom, iterable) {
const visibility = asyncVisible(dom);
const iterator = iterable[Symbol.asyncIterator]();
let promise;
while (true) {
const visible = (await visibility.next()).value;
if (visible) {
let first;
while (true) {
first = await Promise.race([
visibility.next().then(v => v.value),
promise || iterator.next()
]);
if (typeof first != "boolean") {
if (first.done) break;
yield first.value;
promise = iterator.next();
} else if (!first) break;
}
if (first.done) break;
}
}
}