import { asyncScheduler } from '../scheduler/async'; import { operate } from '../util/lift'; import { createOperatorSubscriber } from './OperatorSubscriber'; export function debounceTime(dueTime, scheduler = asyncScheduler) { return operate((source, subscriber) => { let activeTask = null; let lastValue = null; let lastTime = null; const emit = () => { if (activeTask) { activeTask.unsubscribe(); activeTask = null; const value = lastValue; lastValue = null; subscriber.next(value); } }; function emitWhenIdle() { const targetTime = lastTime + dueTime; const now = scheduler.now(); if (now < targetTime) { activeTask = this.schedule(undefined, targetTime - now); subscriber.add(activeTask); return; } emit(); } source.subscribe(createOperatorSubscriber(subscriber, (value) => { lastValue = value; lastTime = scheduler.now(); if (!activeTask) { activeTask = scheduler.schedule(emitWhenIdle, dueTime); subscriber.add(activeTask); } }, () => { emit(); subscriber.complete(); }, undefined, () => { lastValue = activeTask = null; })); }); } //# sourceMappingURL=debounceTime.js.map