export function mergeIterables(...iterables: Iterable[]): Generator; export function mergeIterables(...iterables: Iterable[]): Generator; export function* mergeIterables(...iterables: Iterable[]) { for (const iterable of iterables) { for (const item of iterable) { yield item; } } } export function joinAsyncIterables(...iterables: (Iterable | AsyncIterable)[]): AsyncGenerator, void, void>; export function joinAsyncIterables(...iterables: (Iterable | AsyncIterable)[]): AsyncGenerator; export async function* joinAsyncIterables(...iterables: (Iterable | AsyncIterable)[]) { for (const iterable of iterables) { for await (const item of iterable) { yield item; } } } export function interleaveIterables(...iterables: Iterable[]): Generator; export function interleaveIterables(...iterables: Iterable[]): Generator; export function* interleaveIterables(...iterables: Iterable[]) { const its = iterables.map((e) => e[Symbol.iterator]()); let active = its.length; while (active > 0) { for (const it of its) { if (!it) continue; const r = it.next(); if (r.done) { active--; its[its.indexOf(it)] = undefined as any; } else { yield r.value; } } } } export function interleaveAsyncIterables(...iterables: (Iterable | AsyncIterable)[]): AsyncGenerator; export function interleaveAsyncIterables(...iterables: (Iterable | AsyncIterable)[]): AsyncGenerator; export async function* interleaveAsyncIterables(...iterables: (Iterable | AsyncIterable)[]) { const its = iterables.map((e) => (Symbol.asyncIterator in e ? (e as AsyncIterable)[Symbol.asyncIterator]() : (e as Iterable)[Symbol.iterator]())); let active = its.length; while (active > 0) { for (const it of its) { if (!it) continue; const r = await it.next(); if (r.done) { active--; its[its.indexOf(it)] = undefined as any; } else { yield r.value; } } } }