@reactivex/rxjs
Version:
Reactive Extensions for modern JavaScript
55 lines (43 loc) • 1.45 kB
text/typescript
import { Operator } from '../Operator';
import { Observable } from '../Observable';
import { Subscriber } from '../Subscriber';
import { IScheduler } from '../Scheduler';
import { async } from '../scheduler/async';
/**
* @param scheduler
* @return {Observable<TimeInterval<any>>|WebSocketSubject<T>|Observable<T>}
* @method timeInterval
* @owner Observable
*/
export function timeInterval<T>(this: Observable<T>, scheduler: IScheduler = async): Observable<TimeInterval<T>> {
return this.lift(new TimeIntervalOperator(scheduler));
}
export class TimeInterval<T> {
constructor(public value: T, public interval: number) {
}
};
class TimeIntervalOperator<T> implements Operator<T, TimeInterval<T>> {
constructor(private scheduler: IScheduler) {
}
call(observer: Subscriber<TimeInterval<T>>, source: any): any {
return source.subscribe(new TimeIntervalSubscriber(observer, this.scheduler));
}
}
/**
* We need this JSDoc comment for affecting ESDoc.
* @ignore
* @extends {Ignored}
*/
class TimeIntervalSubscriber<T> extends Subscriber<T> {
private lastTime: number = 0;
constructor(destination: Subscriber<TimeInterval<T>>, private scheduler: IScheduler) {
super(destination);
this.lastTime = scheduler.now();
}
protected _next(value: T) {
let now = this.scheduler.now();
let span = now - this.lastTime;
this.lastTime = now;
this.destination.next(new TimeInterval(value, span));
}
}