Skip to content

Commit 4308a04

Browse files
committed
feat(cache): add cache operator
1 parent b35564e commit 4308a04

File tree

5 files changed

+144
-0
lines changed

5 files changed

+144
-0
lines changed

spec/operators/cache-spec.js

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
/* globals describe, it, expect, expectObservable, hot, rxTestScheduler */
2+
var Rx = require('../../dist/cjs/Rx');
3+
4+
var asap = Rx.Scheduler.asap;
5+
var Observable = Rx.Observable;
6+
7+
describe('Observable.prototype.cache', function () {
8+
it('should replay values upon subscription', function () {
9+
var s1 = hot('---^---a---b---c---| ').cache();
10+
var expected1 = '----a---b---c---| ';
11+
var expected2 = ' (abc|)';
12+
var t = time( '----------------|');
13+
14+
expectObservable(s1).toBe(expected1);
15+
16+
rxTestScheduler.schedule(function () {
17+
expectObservable(s1).toBe(expected2);
18+
}, t);
19+
});
20+
21+
it('should replay values and error', function () {
22+
var s1 = hot('---^---a---b---c---# ').cache();
23+
var expected1 = '----a---b---c---# ';
24+
var expected2 = ' (abc#)';
25+
var t = time( '----------------|');
26+
27+
expectObservable(s1).toBe(expected1);
28+
29+
rxTestScheduler.schedule(function () {
30+
expectObservable(s1).toBe(expected2);
31+
}, t);
32+
});
33+
34+
it('should replay values and and share', function () {
35+
var s1 = hot('---^---a---b---c------------d--e--f-|').cache();
36+
var expected1 = '----a---b---c------------d--e--f-|';
37+
var expected2 = ' (abc)----d--e--f-|';
38+
var t = time( '----------------|');
39+
40+
expectObservable(s1).toBe(expected1);
41+
42+
rxTestScheduler.schedule(function () {
43+
expectObservable(s1).toBe(expected2);
44+
}, t);
45+
});
46+
47+
it('should have a bufferCount that limits the replay test 1', function () {
48+
var s1 = hot('---^---a---b---c------------d--e--f-|').cache(1);
49+
var expected1 = '----a---b---c------------d--e--f-|';
50+
var expected2 = ' c--------d--e--f-|';
51+
var t = time( '----------------|');
52+
53+
expectObservable(s1).toBe(expected1);
54+
55+
rxTestScheduler.schedule(function () {
56+
expectObservable(s1).toBe(expected2);
57+
}, t);
58+
});
59+
60+
it('should have a bufferCount that limits the replay test 2', function () {
61+
var s1 = hot('---^---a---b---c------------d--e--f-|').cache(2);
62+
var expected1 = '----a---b---c------------d--e--f-|';
63+
var expected2 = ' (bc)-----d--e--f-|';
64+
var t = time( '----------------|');
65+
66+
expectObservable(s1).toBe(expected1);
67+
68+
rxTestScheduler.schedule(function () {
69+
expectObservable(s1).toBe(expected2);
70+
}, t);
71+
});
72+
73+
it('should accept a windowTime that limits the replay', function () {
74+
var w = time( '----------|');
75+
var s1 = hot('---^---a---b---c------------d--e--f-|').cache(Number.POSITIVE_INFINITY, w, rxTestScheduler);
76+
var expected1 = '----a---b---c------------d--e--f-|';
77+
var expected2 = ' (bc)-----d--e--f-|';
78+
var t = time( '----------------|');
79+
80+
expectObservable(s1).toBe(expected1);
81+
82+
rxTestScheduler.schedule(function () {
83+
expectObservable(s1).toBe(expected2);
84+
}, t);
85+
});
86+
87+
it('should handle empty', function () {
88+
var s1 = cold('|').cache();
89+
var expected1 = '|';
90+
var expected2 = ' |';
91+
var t = time( '----------------|');
92+
93+
expectObservable(s1).toBe(expected1);
94+
95+
rxTestScheduler.schedule(function () {
96+
expectObservable(s1).toBe(expected2);
97+
}, t);
98+
});
99+
100+
it('should handle throw', function () {
101+
var s1 = cold('#').cache();
102+
var expected1 = '#';
103+
var expected2 = ' #';
104+
var t = time( '----------------|');
105+
106+
expectObservable(s1).toBe(expected1);
107+
108+
rxTestScheduler.schedule(function () {
109+
expectObservable(s1).toBe(expected2);
110+
}, t);
111+
});
112+
113+
it('should handle never', function () {
114+
var s1 = cold('-').cache();
115+
var expected1 = '-';
116+
var expected2 = ' -';
117+
var t = time( '----------------|');
118+
119+
expectObservable(s1).toBe(expected1);
120+
121+
rxTestScheduler.schedule(function () {
122+
expectObservable(s1).toBe(expected2);
123+
}, t);
124+
});
125+
});

src/Observable.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ export class Observable<T> implements CoreOperators<T> {
210210
bufferTime: BufferTimeSignature<T>;
211211
bufferToggle: BufferToggleSignature<T>;
212212
bufferWhen: BufferWhenSignature<T>;
213+
cache: (bufferSize?: number, windowTime?: number, scheduler?: Scheduler) => Observable<T>;
213214
catch: (selector: (err: any, source: Observable<T>, caught: Observable<any>) => Observable<any>) => Observable<T>;
214215
combineAll: <R>(project?: (...values: Array<any>) => R) => Observable<R>;
215216
combineLatest: CombineLatestSignature<T>;

src/Rx.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import './add/operator/bufferCount';
3535
import './add/operator/bufferTime';
3636
import './add/operator/bufferToggle';
3737
import './add/operator/bufferWhen';
38+
import './add/operator/cache';
3839
import './add/operator/catch';
3940
import './add/operator/combineAll';
4041
import './add/operator/combineLatest';

src/add/operator/cache.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
2+
import {Observable} from '../../Observable';
3+
import {cache} from '../../operator/cache';
4+
5+
Observable.prototype.cache = cache;
6+
7+
export var _void: void;

src/operator/cache.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import {Observable} from '../Observable';
2+
import {publishReplay} from './publishReplay';
3+
import {Scheduler} from '../Scheduler';
4+
import {ConnectableObservable} from '../observable/ConnectableObservable';
5+
6+
export function cache<T>(bufferSize: number = Number.POSITIVE_INFINITY,
7+
windowTime: number = Number.POSITIVE_INFINITY,
8+
scheduler?: Scheduler): Observable<T> {
9+
return (<ConnectableObservable<any>>publishReplay.call(this, bufferSize, windowTime, scheduler)).refCount();
10+
}

0 commit comments

Comments
 (0)