import { Subscription } from '../Subscription'; import { operate } from '../util/lift'; import { createOperatorSubscriber } from './OperatorSubscriber'; import { arrRemove } from '../util/arrRemove'; import { asyncScheduler } from '../scheduler/async'; import { popScheduler } from '../util/args'; import { executeSchedule } from '../util/executeSchedule'; export function bufferTime(bufferTimeSpan, ...otherArgs) { var _a, _b; const scheduler = (_a = popScheduler(otherArgs)) !== null && _a !== void 0 ? _a : asyncScheduler; const bufferCreationInterval = (_b = otherArgs[0]) !== null && _b !== void 0 ? _b : null; const maxBufferSize = otherArgs[1] || Infinity; return operate((source, subscriber) => { let bufferRecords = []; let restartOnEmit = false; const emit = (record) => { const { buffer, subs } = record; subs.unsubscribe(); arrRemove(bufferRecords, record); subscriber.next(buffer); restartOnEmit && startBuffer(); }; const startBuffer = () => { if (bufferRecords) { const subs = new Subscription(); subscriber.add(subs); const buffer = []; const record = { buffer, subs, }; bufferRecords.push(record); executeSchedule(subs, scheduler, () => emit(record), bufferTimeSpan); } }; if (bufferCreationInterval !== null && bufferCreationInterval >= 0) { executeSchedule(subscriber, scheduler, startBuffer, bufferCreationInterval, true); } else { restartOnEmit = true; } startBuffer(); const bufferTimeSubscriber = createOperatorSubscriber(subscriber, (value) => { const recordsCopy = bufferRecords.slice(); for (const record of recordsCopy) { const { buffer } = record; buffer.push(value); maxBufferSize <= buffer.length && emit(record); } }, () => { while (bufferRecords === null || bufferRecords === void 0 ? void 0 : bufferRecords.length) { subscriber.next(bufferRecords.shift().buffer); } bufferTimeSubscriber === null || bufferTimeSubscriber === void 0 ? void 0 : bufferTimeSubscriber.unsubscribe(); subscriber.complete(); subscriber.unsubscribe(); }, undefined, () => (bufferRecords = null)); source.subscribe(bufferTimeSubscriber); }); } //# sourceMappingURL=bufferTime.js.map