import { Resolve, resolveLater } from '.'; export function iterateLater(): [AsyncIterable, Resolve, () => void] { let nextInLine = resolveLater(); const queue = [nextInLine]; const completed: T = {} as T; // Marker const next: Resolve = value => { const [_, resolve] = nextInLine; resolve(value); nextInLine = resolveLater(); queue.unshift(nextInLine); }; const iterate = async function* () { while (queue.length > 0) { const [nextValue] = queue.pop() as [Promise, Resolve]; if ((await nextValue) !== completed) yield nextValue; if (globalThis?.process?.env?.VERBOSE) console.debug(`In queue: ${queue.length}`); } }; const complete = () => { const [_, resolve] = nextInLine; resolve(completed); }; return [iterate(), next, complete]; }