From ccd6cb8c71c09009a80ea441e79f6cc063feec61 Mon Sep 17 00:00:00 2001 From: Ryan Streur Date: Wed, 17 Jan 2018 22:46:02 -0800 Subject: [PATCH] add 'first' operator --- src/first.js | 18 +++++++++++ src/index.js | 87 +++++++++++++++++++++++++++++++++++++++++---------- test/first.js | 11 +++++++ 3 files changed, 100 insertions(+), 16 deletions(-) create mode 100644 src/first.js create mode 100644 test/first.js diff --git a/src/first.js b/src/first.js new file mode 100644 index 0000000..1eb54b3 --- /dev/null +++ b/src/first.js @@ -0,0 +1,18 @@ +/** + * Returns the first element to be returned by an Observable + * + * @param {Observable} input Input Observable + * @return {Observable} New Observable + */ + +const first = input => { + let out; + input.subscribe(x => { + if (!out) out = x; + }); + return out; +}; + +first._name = 'first'; + +export default first; diff --git a/src/index.js b/src/index.js index 7cad723..f50ab43 100644 --- a/src/index.js +++ b/src/index.js @@ -1,37 +1,92 @@ -import addOperators from './addOperators' +import addOperators from './addOperators'; +import addCreators from './addCreators'; -import filter from './filter' -import forEach from './forEach' -import map from './map' -import reduce from './reduce' -import scan from './scan' -import take from './take' -import toArray from './toArray' -import transform from './transform' +import catchError from './catchError'; +import concat from './concat'; +import debounce from './debounce'; +import defer from './defer'; +import delay from './delay'; +import error from './error'; +import filter from './filter'; +import first from './first'; +import flatMap from './flatMap'; +import forEach from './forEach'; +import fromEvent from './fromEvent'; +import fromPromise from './fromPromise'; +import interval from './interval'; +import map from './map'; +import merge from './merge'; +import reduce from './reduce'; +import scan from './scan'; +import skip from './skip'; +import skipLast from './skipLast'; +import skipUntil from './skipUntil'; +import startWith from './startWith'; +import take from './take'; +import takeLast from './takeLast'; +import takeUntil from './takeUntil'; +import throttle from './throttle'; +import toArray from './toArray'; +import transform from './transform'; -const addAll = target => { - addOperators(target || Observable.prototype, [ +const addAll = (target = Observable) => { + addCreators(target, [defer, error, fromEvent, fromPromise, interval]); + + addOperators(target.prototype, [ + catchError, + concat, + debounce, + delay, filter, + first, + flatMap, forEach, map, + merge, reduce, scan, + skip, + skipLast, + skipUntil, + startWith, take, + takeLast, + takeUntil, + throttle, toArray, - transform - ]) -} + transform, + ]); +}; export { addAll as default, addAll, addOperators, + catchError, + concat, + debounce, + defer, + delay, + error, filter, + first, + flatMap, forEach, + fromEvent, + fromPromise, + interval, map, + merge, reduce, scan, + skip, + skipLast, + startWith, take, + takeLast, + takeUntil, + throttle, + skipUntil, toArray, - transform -} + transform, +}; diff --git a/test/first.js b/test/first.js new file mode 100644 index 0000000..e456ece --- /dev/null +++ b/test/first.js @@ -0,0 +1,11 @@ +import { expect } from 'chai'; +import first from '../src/first'; +import apiCheck from './common/apiCheck'; + +describe('(First) defer', () => { + apiCheck(first); + + it('emits the first element of an Observable', () => { + expect(first(Observable.of(1, 2, 3))).to.eql(1); + }); +});