diff --git a/src/operator/repeat.ts b/src/operator/repeat.ts index 315a2173f3..5fd52e5e0a 100644 --- a/src/operator/repeat.ts +++ b/src/operator/repeat.ts @@ -1,8 +1,6 @@ -import { Operator } from '../Operator'; -import { Subscriber } from '../Subscriber'; + import { Observable } from '../Observable'; -import { EmptyObservable } from '../observable/EmptyObservable'; -import { TeardownLogic } from '../Subscription'; +import { repeat as higherOrder } from '../operators/repeat'; /** * Returns an Observable that repeats the stream of items emitted by the source Observable at most count times. @@ -17,44 +15,5 @@ import { TeardownLogic } from '../Subscription'; * @owner Observable */ export function repeat(this: Observable, count: number = -1): Observable { - if (count === 0) { - return new EmptyObservable(); - } else if (count < 0) { - return this.lift(new RepeatOperator(-1, this)); - } else { - return this.lift(new RepeatOperator(count - 1, this)); - } -} - -class RepeatOperator implements Operator { - constructor(private count: number, - private source: Observable) { - } - call(subscriber: Subscriber, source: any): TeardownLogic { - return source.subscribe(new RepeatSubscriber(subscriber, this.count, this.source)); - } -} - -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -class RepeatSubscriber extends Subscriber { - constructor(destination: Subscriber, - private count: number, - private source: Observable) { - super(destination); - } - complete() { - if (!this.isStopped) { - const { source, count } = this; - if (count === 0) { - return super.complete(); - } else if (count > -1) { - this.count = count - 1; - } - source.subscribe(this._unsubscribeAndRecycle()); - } - } + return higherOrder(count)(this); } diff --git a/src/operators/index.ts b/src/operators/index.ts index 1d9ef31314..5d754be3fd 100644 --- a/src/operators/index.ts +++ b/src/operators/index.ts @@ -53,6 +53,7 @@ export { publish } from './publish'; export { publishBehavior } from './publishBehavior'; export { race } from './race'; export { reduce } from './reduce'; +export { repeat } from './repeat'; export { refCount } from './refCount'; export { scan } from './scan'; export { subscribeOn } from './subscribeOn'; diff --git a/src/operators/repeat.ts b/src/operators/repeat.ts new file mode 100644 index 0000000000..427d00cf3c --- /dev/null +++ b/src/operators/repeat.ts @@ -0,0 +1,63 @@ +import { Operator } from '../Operator'; +import { Subscriber } from '../Subscriber'; +import { Observable } from '../Observable'; +import { EmptyObservable } from '../observable/EmptyObservable'; +import { TeardownLogic } from '../Subscription'; +import { MonoTypeOperatorFunction } from '../interfaces'; + +/** + * Returns an Observable that repeats the stream of items emitted by the source Observable at most count times. + * + * + * + * @param {number} [count] The number of times the source Observable items are repeated, a count of 0 will yield + * an empty Observable. + * @return {Observable} An Observable that repeats the stream of items emitted by the source Observable at most + * count times. + * @method repeat + * @owner Observable + */ +export function repeat(count: number = -1): MonoTypeOperatorFunction { + return (source: Observable) => { + if (count === 0) { + return new EmptyObservable(); + } else if (count < 0) { + return source.lift(new RepeatOperator(-1, source)); + } else { + return source.lift(new RepeatOperator(count - 1, source)); + } + }; +} + +class RepeatOperator implements Operator { + constructor(private count: number, + private source: Observable) { + } + call(subscriber: Subscriber, source: any): TeardownLogic { + return source.subscribe(new RepeatSubscriber(subscriber, this.count, this.source)); + } +} + +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +class RepeatSubscriber extends Subscriber { + constructor(destination: Subscriber, + private count: number, + private source: Observable) { + super(destination); + } + complete() { + if (!this.isStopped) { + const { source, count } = this; + if (count === 0) { + return super.complete(); + } else if (count > -1) { + this.count = count - 1; + } + source.subscribe(this._unsubscribeAndRecycle()); + } + } +}