UNPKG

3.66 kBJavaScriptView Raw
1import { identityAsync } from '../util/identity';
2import { bindCallback } from '../util/bindcallback';
3import { isIterable, isAsyncIterable, isArrayLike, isIterator, isPromise, isObservable } from '../util/isiterable';
4import { toLength } from '../util/tolength';
5import { AsyncSink } from './asyncsink';
6export let from;
7export let FromArrayIterable;
8export let FromAsyncIterable;
9export let FromPromiseIterable;
10export let FromObservableAsyncIterable;
11export function _initialize(Ctor) {
12 /** @nocollapse */
13 from = function (source, selector = identityAsync, thisArg) {
14 const fn = bindCallback(selector, thisArg, 2);
15 if (isIterable(source) || isAsyncIterable(source)) {
16 return new FromAsyncIterable(source, fn);
17 }
18 if (isPromise(source)) {
19 return new FromPromiseIterable(source, fn);
20 }
21 if (isObservable(source)) {
22 return new FromObservableAsyncIterable(source, fn);
23 }
24 if (isArrayLike(source)) {
25 return new FromArrayIterable(source, fn);
26 }
27 if (isIterator(source)) {
28 return new FromAsyncIterable({ [Symbol.asyncIterator]: () => source }, fn);
29 }
30 throw new TypeError('Input type not supported');
31 };
32 // eslint-disable-next-line no-shadow
33 FromArrayIterable = class FromArrayIterable extends Ctor {
34 constructor(source, selector) {
35 super();
36 this._source = source;
37 this._selector = selector;
38 }
39 async *[Symbol.asyncIterator]() {
40 let i = 0;
41 const length = toLength(this._source.length);
42 while (i < length) {
43 yield await this._selector(this._source[i], i++);
44 }
45 }
46 };
47 // eslint-disable-next-line no-shadow
48 FromAsyncIterable = class FromAsyncIterable extends Ctor {
49 constructor(source, selector) {
50 super();
51 this._source = source;
52 this._selector = selector;
53 }
54 async *[Symbol.asyncIterator]() {
55 let i = 0;
56 for await (const item of this._source) {
57 yield await this._selector(item, i++);
58 }
59 }
60 };
61 // eslint-disable-next-line no-shadow
62 FromPromiseIterable = class FromPromiseIterable extends Ctor {
63 constructor(source, selector) {
64 super();
65 this._source = source;
66 this._selector = selector;
67 }
68 async *[Symbol.asyncIterator]() {
69 const item = await this._source;
70 yield await this._selector(item, 0);
71 }
72 };
73 // eslint-disable-next-line no-shadow
74 FromObservableAsyncIterable = class FromObservableAsyncIterable extends Ctor {
75 constructor(observable, selector) {
76 super();
77 this._observable = observable;
78 this._selector = selector;
79 }
80 async *[Symbol.asyncIterator]() {
81 const sink = new AsyncSink();
82 const subscription = this._observable.subscribe({
83 next(value) {
84 sink.write(value);
85 },
86 error(err) {
87 sink.error(err);
88 },
89 complete() {
90 sink.end();
91 }
92 });
93 let i = 0;
94 try {
95 for (let next; !(next = await sink.next()).done;) {
96 yield await this._selector(next.value, i++);
97 }
98 }
99 finally {
100 subscription.unsubscribe();
101 }
102 }
103 };
104}
105
106//# sourceMappingURL=from.mjs.map