1 import { OuterSubscriber } from '../OuterSubscriber';
2 import { InnerSubscriber } from '../InnerSubscriber';
3 import { subscribeToResult } from '../util/subscribeToResult';
4 import { map } from './map';
5 import { from } from '../observable/from';
6 export function switchMap(project, resultSelector) {
7 if (typeof resultSelector === 'function') {
8 return (source) => source.pipe(switchMap((a, i) => from(project(a, i)).pipe(map((b, ii) => resultSelector(a, b, i, ii)))));
10 return (source) => source.lift(new SwitchMapOperator(project));
12 class SwitchMapOperator {
13 constructor(project) {
14 this.project = project;
16 call(subscriber, source) {
17 return source.subscribe(new SwitchMapSubscriber(subscriber, this.project));
20 class SwitchMapSubscriber extends OuterSubscriber {
21 constructor(destination, project) {
23 this.project = project;
28 const index = this.index++;
30 result = this.project(value, index);
33 this.destination.error(error);
36 this._innerSub(result, value, index);
38 _innerSub(result, value, index) {
39 const innerSubscription = this.innerSubscription;
40 if (innerSubscription) {
41 innerSubscription.unsubscribe();
43 const innerSubscriber = new InnerSubscriber(this, value, index);
44 const destination = this.destination;
45 destination.add(innerSubscriber);
46 this.innerSubscription = subscribeToResult(this, result, undefined, undefined, innerSubscriber);
47 if (this.innerSubscription !== innerSubscriber) {
48 destination.add(this.innerSubscription);
52 const { innerSubscription } = this;
53 if (!innerSubscription || innerSubscription.closed) {
59 this.innerSubscription = null;
61 notifyComplete(innerSub) {
62 const destination = this.destination;
63 destination.remove(innerSub);
64 this.innerSubscription = null;
69 notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {
70 this.destination.next(innerValue);
73 //# sourceMappingURL=switchMap.js.map