Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor(mergeMap): readd resultSelector as deprecated #3494

Merged
merged 7 commits into from Mar 30, 2018
2 changes: 0 additions & 2 deletions compat/operator/exhaust.ts
Expand Up @@ -37,8 +37,6 @@ export function exhaust<T, R>(this: Observable<T>): Observable<R>;
*
* @return {Observable} An Observable that takes a source of Observables and propagates the first observable
* exclusively until it completes before subscribing to the next.
* @method exhaust
* @owner Observable
*/
export function exhaust<T>(this: Observable<ObservableInput<T>>): Observable<T> {
return higherOrder<T>()(this);
Expand Down
6 changes: 2 additions & 4 deletions compat/operator/exhaustMap.ts
Expand Up @@ -20,8 +20,8 @@ import { exhaustMap as higherOrder } from 'rxjs/operators';
* and repeat this process.
*
* @example <caption>Run a finite timer for each click, only if there is no currently active timer</caption>
* var clicks = Rx.Observable.fromEvent(document, 'click');
* var result = clicks.exhaustMap((ev) => Rx.Observable.interval(1000).take(5));
* var clicks = fromEvent(document, 'click');
* var result = clicks.pipe(exhaustMap((ev) => Rx.Observable.interval(1000).take(5)));
* result.subscribe(x => console.log(x));
*
* @see {@link concatMap}
Expand All @@ -35,8 +35,6 @@ import { exhaustMap as higherOrder } from 'rxjs/operators';
* @return {Observable} An Observable containing projected Observables
* of each item of the source, ignoring projected Observables that start before
* their preceding Observable has completed.
* @method exhaustMap
* @owner Observable
*/
export function exhaustMap<T, R>(
this: Observable<T>,
Expand Down
118 changes: 87 additions & 31 deletions spec/operators/concatMap-spec.ts
@@ -1,11 +1,10 @@
import { expect } from 'chai';
import * as Rx from 'rxjs/Rx';
import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/marble-testing';
import { Observable, of, from } from 'rxjs';
import { concatMap, mergeMap } from 'rxjs/operators';

declare function asDiagram(arg: string): Function;

const Observable = Rx.Observable;

/** @test {concatMap} */
describe('Observable.prototype.concatMap', () => {
asDiagram('concatMap(i => 10*i\u2014\u201410*i\u2014\u201410*i\u2014| )')
Expand All @@ -22,6 +21,62 @@ describe('Observable.prototype.concatMap', () => {
expectSubscriptions(e1.subscriptions).toBe(e1subs);
});

it('should support the deprecated resultSelector', () => {
const results: Array<number[]> = [];

of(1, 2, 3).pipe(
concatMap(
x => of(x, x + 1, x + 2),
(a, b, i, ii) => [a, b, i, ii]
)
)
.subscribe({
next (value) {
results.push(value);
},
error(err) {
throw err;
},
complete() {
expect(results).to.deep.equal([
[1, 1, 0, 0],
[1, 2, 0, 1],
[1, 3, 0, 2],
[2, 2, 1, 0],
[2, 3, 1, 1],
[2, 4, 1, 2],
[3, 3, 2, 0],
[3, 4, 2, 1],
[3, 5, 2, 2],
]);
}
});
});

it('should support a void resultSelector (still deprecated)', () => {
const results: number[] = [];

of(1, 2, 3).pipe(
concatMap(
x => of(x, x + 1, x + 2),
void 0
)
)
.subscribe({
next (value) {
results.push(value);
},
error(err) {
throw err;
},
complete() {
expect(results).to.deep.equal([
1, 2, 3, 2, 3, 4, 3, 4, 5
]);
}
});
});

it('should concatenate many regular interval inners', () => {
const a = cold('--a-a-a-(a|) ');
const asubs = '^ ! ';
Expand All @@ -36,7 +91,7 @@ describe('Observable.prototype.concatMap', () => {
const expected = '--a-a-a-a---b--b--b-------c-c-c-----(d|)';

const observableLookup = { a: a, b: b, c: c, d: d };
const source = e1.concatMap((value) => observableLookup[value]);
const source = e1.pipe(concatMap((value) => observableLookup[value]));

expectObservable(source).toBe(expected);
expectSubscriptions(a.subscriptions).toBe(asubs);
Expand All @@ -57,7 +112,7 @@ describe('Observable.prototype.concatMap', () => {
' ^ !'];
const expected = '---i-j-k-l---i-j-k-l---i-j-k-l---i-j-k-l-|';

const result = e1.concatMap((value) => inner);
const result = e1.pipe(concatMap((value) => inner));

expectObservable(result).toBe(expected, values);
expectSubscriptions(inner.subscriptions).toBe(innersubs);
Expand All @@ -71,7 +126,7 @@ describe('Observable.prototype.concatMap', () => {
const innersubs: string[] = [];
const expected = '|';

const result = e1.concatMap(() => inner);
const result = e1.pipe(concatMap(() => inner));

expectObservable(result).toBe(expected);
expectSubscriptions(inner.subscriptions).toBe(innersubs);
Expand All @@ -85,7 +140,7 @@ describe('Observable.prototype.concatMap', () => {
const innersubs: string[] = [];
const expected = '-';

const result = e1.concatMap(() => { return inner; });
const result = e1.pipe(concatMap(() => { return inner; }));

expectObservable(result).toBe(expected);
expectSubscriptions(inner.subscriptions).toBe(innersubs);
Expand All @@ -99,7 +154,7 @@ describe('Observable.prototype.concatMap', () => {
const innersubs: string[] = [];
const expected = '#';

const result = e1.concatMap(() => { return inner; });
const result = e1.pipe(concatMap(() => { return inner; }));

expectObservable(result).toBe(expected);
expectSubscriptions(inner.subscriptions).toBe(innersubs);
Expand All @@ -115,7 +170,7 @@ describe('Observable.prototype.concatMap', () => {
' (^!)'];
const expected = '---------| ';

const result = e1.concatMap(() => { return inner; });
const result = e1.pipe(concatMap(() => { return inner; }));

expectObservable(result).toBe(expected);
expectSubscriptions(inner.subscriptions).toBe(innersubs);
Expand All @@ -129,7 +184,7 @@ describe('Observable.prototype.concatMap', () => {
const innersubs = ' ^ ';
const expected = '----------';

const result = e1.concatMap(() => { return inner; });
const result = e1.pipe(concatMap(() => { return inner; }));

expectObservable(result).toBe(expected);
expectSubscriptions(inner.subscriptions).toBe(innersubs);
Expand All @@ -143,7 +198,7 @@ describe('Observable.prototype.concatMap', () => {
const innersubs = ' (^!) ';
const expected = '--# ';

const result = e1.concatMap(() => { return inner; });
const result = e1.pipe(concatMap(() => { return inner; }));

expectObservable(result).toBe(expected);
expectSubscriptions(inner.subscriptions).toBe(innersubs);
Expand All @@ -161,7 +216,7 @@ describe('Observable.prototype.concatMap', () => {
' ^ ! '];
const expected = '---i-j-k-l---i-j-k-l---i-j-k-l---i-j-k-l--------|';

const result = e1.concatMap((value) => inner);
const result = e1.pipe(concatMap((value) => inner));

expectObservable(result).toBe(expected, values);
expectSubscriptions(inner.subscriptions).toBe(innersubs);
Expand All @@ -179,7 +234,7 @@ describe('Observable.prototype.concatMap', () => {
' ^ ! '];
const expected = '---i-j-k-l---i-j-k-l---i-j-k-l---i-j-k-l---------';

const result = e1.concatMap((value) => inner);
const result = e1.pipe(concatMap((value) => inner));

expectObservable(result).toBe(expected, values);
expectSubscriptions(inner.subscriptions).toBe(innersubs);
Expand All @@ -194,7 +249,7 @@ describe('Observable.prototype.concatMap', () => {
const innersubs = ' ^ ';
const expected = '---i-j-k-l--------';

const result = e1.concatMap((value) => inner);
const result = e1.pipe(concatMap((value) => inner));

expectObservable(result).toBe(expected, values);
expectSubscriptions(inner.subscriptions).toBe(innersubs);
Expand All @@ -209,7 +264,7 @@ describe('Observable.prototype.concatMap', () => {
const innersubs = ' ^ ! ';
const expected = '---i-j-k-l-# ';

const result = e1.concatMap((value) => inner);
const result = e1.pipe(concatMap((value) => inner));

expectObservable(result).toBe(expected, values);
expectSubscriptions(inner.subscriptions).toBe(innersubs);
Expand All @@ -225,7 +280,7 @@ describe('Observable.prototype.concatMap', () => {
' ^ !'];
const expected = '---i-j-k-l---i-j-#';

const result = e1.concatMap((value) => inner);
const result = e1.pipe(concatMap((value) => inner));

expectObservable(result).toBe(expected, values);
expectSubscriptions(inner.subscriptions).toBe(innersubs);
Expand All @@ -240,7 +295,7 @@ describe('Observable.prototype.concatMap', () => {
const innersubs = ' ^ ! ';
const expected = '---i-j-k-l-# ';

const result = e1.concatMap((value) => inner);
const result = e1.pipe(concatMap((value) => inner));

expectObservable(result).toBe(expected, values);
expectSubscriptions(inner.subscriptions).toBe(innersubs);
Expand All @@ -267,7 +322,7 @@ describe('Observable.prototype.concatMap', () => {
const expected = '---2--3--4--5----6-----2--3-1------2--3-4-5--------1-2|';
const observableLookup = { a: a, b: b, c: c, d: d, e: e, f: f, g: g };

const result = e1.concatMap((value) => observableLookup[value]);
const result = e1.pipe(concatMap((value) => observableLookup[value]));

expectObservable(result).toBe(expected);
expectSubscriptions(a.subscriptions).toBe(asubs);
Expand Down Expand Up @@ -300,7 +355,7 @@ describe('Observable.prototype.concatMap', () => {
const expected = '---2--3--4--5----6-----2--3----------------------------';
const observableLookup = { a: a, b: b, c: c, d: d, e: e, f: f, g: g };

const result = e1.concatMap((value) => observableLookup[value]);
const result = e1.pipe(concatMap((value) => observableLookup[value]));

expectObservable(result).toBe(expected);
expectSubscriptions(a.subscriptions).toBe(asubs);
Expand Down Expand Up @@ -333,7 +388,7 @@ describe('Observable.prototype.concatMap', () => {
const expected = '---2--3--4--5----6-----2--3-1------2--3-4-5--------1-2-';
const observableLookup = { a: a, b: b, c: c, d: d, e: e, f: f, g: g };

const result = e1.concatMap((value) => observableLookup[value]);
const result = e1.pipe(concatMap((value) => observableLookup[value]));

expectObservable(result).toBe(expected);
expectSubscriptions(a.subscriptions).toBe(asubs);
Expand Down Expand Up @@ -366,7 +421,7 @@ describe('Observable.prototype.concatMap', () => {
const expected = '---2--3--4--5----6-----2--3-1------2--3# ';
const observableLookup = { a: a, b: b, c: c, d: d, e: e, f: f, g: g };

const result = e1.concatMap((value) => observableLookup[value]);
const result = e1.pipe(concatMap((value) => observableLookup[value]));

expectObservable(result).toBe(expected);
expectSubscriptions(a.subscriptions).toBe(asubs);
Expand Down Expand Up @@ -399,7 +454,7 @@ describe('Observable.prototype.concatMap', () => {
const expected = '---2--3--4--5----6-# ';
const observableLookup = { a: a, b: b, c: c, d: d, e: e, f: f, g: g };

const result = e1.concatMap((value) => observableLookup[value]);
const result = e1.pipe(concatMap((value) => observableLookup[value]));

expectObservable(result).toBe(expected);
expectSubscriptions(a.subscriptions).toBe(asubs);
Expand Down Expand Up @@ -433,7 +488,7 @@ describe('Observable.prototype.concatMap', () => {
const expected = '---2--3--4--5----6-----2--3-1-- ';
const observableLookup = { a: a, b: b, c: c, d: d, e: e, f: f, g: g };

const result = e1.concatMap((value) => observableLookup[value]);
const result = e1.pipe(concatMap((value) => observableLookup[value]));

expectObservable(result, unsub).toBe(expected);
expectSubscriptions(a.subscriptions).toBe(asubs);
Expand Down Expand Up @@ -467,10 +522,11 @@ describe('Observable.prototype.concatMap', () => {
const expected = '---2--3--4--5----6-----2--3-1-- ';
const observableLookup = { a: a, b: b, c: c, d: d, e: e, f: f, g: g };

const result = e1
.mergeMap((x) => Observable.of(x))
.concatMap((value) => observableLookup[value])
.mergeMap((x) => Observable.of(x));
const result = e1.pipe(
mergeMap(x => of(x)),
concatMap(value => observableLookup[value]),
mergeMap(x => of(x))
);

expectObservable(result, unsub).toBe(expected);
expectSubscriptions(a.subscriptions).toBe(asubs);
Expand Down Expand Up @@ -568,7 +624,7 @@ describe('Observable.prototype.concatMap', () => {
expectSubscriptions(e1.subscriptions).toBe(e1subs);
});
it('should map values to constant resolved promises and concatenate', (done: MochaDone) => {
const source = Rx.Observable.from([4, 3, 2, 1]);
const source = from([4, 3, 2, 1]);
const project = (value: number) => Observable.from(Promise.resolve(42));

const results: number[] = [];
Expand All @@ -584,7 +640,7 @@ describe('Observable.prototype.concatMap', () => {
});

it('should map values to constant rejected promises and concatenate', (done) => {
const source = Rx.Observable.from([4, 3, 2, 1]);
const source = from([4, 3, 2, 1]);
const project = (value: any) => Observable.from(Promise.reject(42));

source.concatMap(project).subscribe(
Expand All @@ -599,7 +655,7 @@ describe('Observable.prototype.concatMap', () => {
});

it('should map values to resolved promises and concatenate', (done) => {
const source = Rx.Observable.from([4, 3, 2, 1]);
const source = from([4, 3, 2, 1]);
const project = (value: number, index: number) => Observable.from(Promise.resolve(value + index));

const results: number[] = [];
Expand All @@ -615,7 +671,7 @@ describe('Observable.prototype.concatMap', () => {
});

it('should map values to rejected promises and concatenate', (done) => {
const source = Rx.Observable.from([4, 3, 2, 1]);
const source = from([4, 3, 2, 1]);
const project = (value: number, index: number) => Observable.from(Promise.reject('' + value + '-' + index));

source.concatMap(project).subscribe(
Expand Down