-
Notifications
You must be signed in to change notification settings - Fork 3k
/
subscribeTo.ts
39 lines (38 loc) · 1.62 KB
/
subscribeTo.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import { Observable } from '../Observable';
import { ObservableInput } from '../types';
import { subscribeToArray } from './subscribeToArray';
import { subscribeToPromise } from './subscribeToPromise';
import { subscribeToIterable } from './subscribeToIterable';
import { subscribeToObservable } from './subscribeToObservable';
import { isArrayLike } from './isArrayLike';
import { isPromise } from './isPromise';
import { isObject } from './isObject';
import { iterator as Symbol_iterator } from '../symbol/iterator';
import { observable as Symbol_observable } from '../symbol/observable';
import { Subscriber } from '../Subscriber';
export const subscribeTo = <T>(result: ObservableInput<T>) => {
if (result instanceof Observable) {
return (subscriber: Subscriber<T>) => {
if (result._isScalar) {
subscriber.next((result as any).value);
subscriber.complete();
return undefined;
} else {
return result.subscribe(subscriber);
}
};
} else if (isArrayLike(result)) {
return subscribeToArray(result);
} else if (isPromise(result)) {
return subscribeToPromise(result as Promise<any>);
} else if (result && typeof result[Symbol_iterator] === 'function') {
return subscribeToIterable(result as any);
} else if (result && typeof result[Symbol_observable] === 'function') {
return subscribeToObservable(result as any);
} else {
const value = isObject(result) ? 'an invalid object' : `'${result}'`;
const msg = `You provided ${value} where a stream was expected.`
+ ' You can provide an Observable, Promise, Array, or Iterable.';
throw new TypeError(msg);
}
};