Skip to content

Instantly share code, notes, and snippets.

@bouzuya
Created January 13, 2016 11:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bouzuya/5962a5fa094fdbefcf05 to your computer and use it in GitHub Desktop.
Save bouzuya/5962a5fa094fdbefcf05 to your computer and use it in GitHub Desktop.
RxJS 4 Observable.prototype.pairwise 的な関数を RxJS 5 で
import assert from 'power-assert';
import { Observable } from 'rxjs';
import pairwise from '../src/pairwise';
describe('pairwise', function() {
context('when []', function() {
it('works', function() {
const source = Observable.fromArray([]);
pairwise(source)
.toArray()
.subscribe(array => {
assert(array.length === 0);
});
});
});
context('when [1]', function() {
it('works', function() {
const source = Observable.fromArray([1]);
pairwise(source)
.toArray()
.subscribe(array => {
assert(array.length === 0);
});
});
});
context('when [1, 2, 3, 4]', function() {
it('works', function() {
const source = Observable.fromArray([1, 2, 3, 4]);
pairwise(source)
.toArray()
.subscribe(array => {
assert(array.length === 3);
const [i1, i2, i3] = array;
assert.deepEqual(i1, [1, 2]);
assert.deepEqual(i2, [2, 3]);
assert.deepEqual(i3, [3, 4]);
});
});
});
});
import { Observable } from 'rxjs';
export default function pairwise<T>(
observable: Observable<T>
): Observable<[T, T]> {
return observable
.scan<{ hp: boolean; p: T; pair: [T, T] }>(({ hp, p }, x) => {
return { hp: true, p: x, pair: (hp ? [p, x] : null) };
}, { hp: false, p: null, pair: null })
.map(({ pair }) => pair)
.filter(pair => pair !== null);
}