@thi.ng/transducers-async
Version:
Async versions of various highly composable transducers, reducers and iterators
33 lines (32 loc) • 820 B
JavaScript
async function* sidechain(src, side, opts) {
const { lastOnly = true } = opts || {};
const $iter = src[Symbol.asyncIterator]();
const $side = side[Symbol.asyncIterator]();
const promises = [
$iter.next().then((res) => [res]),
$side.next().then((res) => [res, true])
];
let buf = [];
while (true) {
const [res, side2] = await Promise.race(promises);
if (res.done) return;
if (side2) {
promises[1] = $side.next().then((res2) => [res2, true]);
if (!buf.length) continue;
if (lastOnly) {
yield buf[0];
buf.length = 0;
} else {
yield buf;
buf = [];
}
} else {
promises[0] = $iter.next().then((res2) => [res2]);
if (lastOnly) buf[0] = res.value;
else buf.push(res.value);
}
}
}
export {
sidechain
};