// Copyright 2021 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only /* eslint-disable max-classes-per-file */ /* eslint-disable no-await-in-loop */ export type MaybeAsyncIterable = Iterable | AsyncIterable; export function concat( iterables: Iterable> ): AsyncIterable { return new ConcatAsyncIterable(iterables); } class ConcatAsyncIterable implements AsyncIterable { constructor(private readonly iterables: Iterable>) {} async *[Symbol.asyncIterator](): AsyncIterator { for (const iterable of this.iterables) { for await (const value of iterable) { yield value; } } } } export function wrapPromise( promise: Promise> ): AsyncIterable { return new WrapPromiseAsyncIterable(promise); } class WrapPromiseAsyncIterable implements AsyncIterable { constructor(private readonly promise: Promise>) {} async *[Symbol.asyncIterator](): AsyncIterator { for await (const value of await this.promise) { yield value; } } }