UNPKG

1.78 kBPlain TextView Raw
1import { ObservableLike, iterateLater } from '.';
2
3export 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
9function _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
32type ValueTypes<T> =
33 | T
34 | PromiseLike<T>
35 | ObservableLike<T>
36 | Iterable<PromiseLike<T> | T>
37 | AsyncIterable<T>;
38
39export function toAsyncIterable<T>(): (
40 value: T | PromiseLike<T> | ObservableLike<T> | Iterable<PromiseLike<T> | T> | AsyncIterable<T>
41) => AsyncIterable<T>;
42export function toAsyncIterable<T>(
43 value: T | PromiseLike<T> | ObservableLike<T> | Iterable<PromiseLike<T> | T> | AsyncIterable<T>
44): AsyncIterable<T>;
45export 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}