import assertExists from "./assertExists"; import assertState from "./assertState"; export default async function* (n: number, seq: AsyncIterable) { assertState(n > 0); const it = seq[Symbol.asyncIterator](); let done = false; const buffer = Array>>(); let fetching = false; const maybeFetch = async () => { if (fetching) { return; } fetching = true; while (buffer.length < n && !done) { const next = it.next(); buffer.push(next); const e = await next; if (e.done) { done = true; } } fetching = false; }; while (true) { maybeFetch(); if (done) { break; } const e = await assertExists(buffer.shift()); if (e.done) { break; } yield e.value; } }