1 | import { ObservableLike, iterateLater } from '.';
|
2 |
|
3 | export function asyncIterableFromObservable<T>(observable: ObservableLike<T>) {
|
4 | const [iterable, next, complete] = iterateLater<T>();
|
5 | observable.subscribe(next, error => next(Promise.reject(error)), complete);
|
6 | return iterable;
|
7 | }
|
8 |
|
9 | function _toAsyncIterable<T>(
|
10 | value: T | PromiseLike<T> | ObservableLike<T> | Iterable<PromiseLike<T> | T> | AsyncIterable<T>
|
11 | ): AsyncIterable<T> {
|
12 | if (typeof (value as AsyncIterable<T>)[Symbol.asyncIterator] === 'function') return value as AsyncIterable<T>;
|
13 |
|
14 | if (typeof (value as ObservableLike<T>).subscribe === 'function')
|
15 | return asyncIterableFromObservable(value as ObservableLike<T>);
|
16 |
|
17 | let iterate: () => AsyncIterable<T>;
|
18 | if (typeof (value as Iterable<T>)[Symbol.iterator] === 'function') {
|
19 | iterate = async function* () {
|
20 | for (const element of value as Iterable<PromiseLike<T> | T>) {
|
21 | yield await element;
|
22 | }
|
23 | };
|
24 | } else {
|
25 | iterate = async function* () {
|
26 | yield (await value) as T | PromiseLike<T>;
|
27 | };
|
28 | }
|
29 | return iterate();
|
30 | }
|
31 |
|
32 | type ValueTypes<T> =
|
33 | | T
|
34 | | PromiseLike<T>
|
35 | | ObservableLike<T>
|
36 | | Iterable<PromiseLike<T> | T>
|
37 | | AsyncIterable<T>;
|
38 |
|
39 | export function toAsyncIterable<T>(): (
|
40 | value: T | PromiseLike<T> | ObservableLike<T> | Iterable<PromiseLike<T> | T> | AsyncIterable<T>
|
41 | ) => AsyncIterable<T>;
|
42 | export function toAsyncIterable<T>(
|
43 | value: T | PromiseLike<T> | ObservableLike<T> | Iterable<PromiseLike<T> | T> | AsyncIterable<T>
|
44 | ): AsyncIterable<T>;
|
45 | export function toAsyncIterable<T>(
|
46 | value?: ValueTypes<T>
|
47 | ): AsyncIterable<T> | ((value: ValueTypes<T>) => AsyncIterable<T>) {
|
48 | return typeof value === 'undefined'
|
49 | ? (curriedValue: ValueTypes<T>) => _toAsyncIterable(curriedValue)
|
50 | : _toAsyncIterable(value);
|
51 | }
|