UNPKG

@reactivex/ix-esnext-esm

Version:

The Interactive Extensions for JavaScript

69 lines (67 loc) 2.25 kB
import { IterableX } from '../iterablex'; import { MaxRefCountList, RefCountList } from './_refcountlist'; import { create } from '../create'; class MemoizeBuffer extends IterableX { constructor(source, buffer) { super(); this._stopped = false; this._source = source; this._buffer = buffer; } // eslint-disable-next-line complexity *[Symbol.iterator]() { let i = 0; try { while (1) { let hasValue = false; let current = {}; if (i >= this._buffer.count) { if (!this._stopped) { try { const next = this._source.next(); hasValue = !next.done; // eslint-disable-next-line max-depth if (hasValue) { current = next.value; } } catch (e) { this._error = e; this._stopped = true; } } if (this._stopped) { throw this._error; } if (hasValue) { this._buffer.push(current); } } else { hasValue = true; } if (hasValue) { yield this._buffer.get(i); } else { break; } i++; } } finally { this._buffer.done(); } } } export function memoize(readerCount = -1, selector) { return function memoizeOperatorFunction(source) { if (!selector) { return readerCount === -1 ? new MemoizeBuffer(source[Symbol.iterator](), new MaxRefCountList()) : new MemoizeBuffer(source[Symbol.iterator](), new RefCountList(readerCount)); } return create(() => selector(memoize(readerCount)(source))[Symbol.iterator]()); }; } //# sourceMappingURL=memoize.mjs.map