{"version":3,"sources":["asynciterable/operators/memoize.ts"],"names":[],"mappings":"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","file":"memoize.js","sourcesContent":["import { AsyncIterableX } from '../asynciterablex';\nimport {\n  IRefCountList,\n  MaxRefCountList,\n  RefCountList\n} from '../../iterable/operators/_refcountlist';\nimport { create } from '../create';\nimport { OperatorAsyncFunction } from '../../interfaces';\n\nexport class MemoizeAsyncBuffer<T> extends AsyncIterableX<T> {\n  protected _source: AsyncIterator<T>;\n  protected _buffer: IRefCountList<T>;\n  protected _shared: Promise<IteratorResult<T>> | null;\n  protected _error: any;\n  protected _stopped: boolean;\n\n  constructor(source: AsyncIterator<T>, buffer: IRefCountList<T>) {\n    super();\n    this._error = null;\n    this._shared = null;\n    this._stopped = false;\n    this._source = source;\n    this._buffer = buffer;\n  }\n\n  [Symbol.asyncIterator]() {\n    return this._getIterable(0);\n  }\n\n  protected async *_getIterable(offset = 0) {\n    let i = offset - 1;\n    let done: boolean | undefined = false;\n    const buffer = this._buffer;\n\n    try {\n      do {\n        if (++i < buffer.count) {\n          yield buffer.get(i);\n          continue;\n        }\n\n        if (this._stopped) {\n          throw this._error;\n        }\n\n        if (this._shared === null) {\n          this._shared = this._source.next().then(r => {\n            this._shared = null;\n            if (!r.done) {\n              buffer.push(r.value);\n            }\n            return r;\n          });\n        }\n\n        ({ done } = await this._shared.catch(e => {\n          this._error = e;\n          this._stopped = true;\n          throw e;\n        }));\n\n        if (!done) {\n          yield buffer.get(i);\n        }\n      } while (!done);\n    } finally {\n      buffer.done();\n    }\n  }\n}\n\nexport function memoize<TSource>(readerCount?: number): OperatorAsyncFunction<TSource, TSource>;\nexport function memoize<TSource, TResult>(\n  readerCount?: number,\n  selector?: (value: AsyncIterableX<TSource>) => AsyncIterable<TResult>\n): OperatorAsyncFunction<TSource, TResult>;\nexport function memoize<TSource, TResult = TSource>(\n  readerCount: number = -1,\n  selector?: (value: AsyncIterableX<TSource>) => AsyncIterable<TResult>\n): OperatorAsyncFunction<TSource, TSource | TResult> {\n  return function memoizeOperatorFunction(\n    source: AsyncIterable<TSource>\n  ): AsyncIterableX<TSource | TResult> {\n    if (!selector) {\n      return readerCount === -1\n        ? new MemoizeAsyncBuffer<TSource>(\n          source[Symbol.asyncIterator](),\n          new MaxRefCountList<TSource>()\n        )\n        : new MemoizeAsyncBuffer<TSource>(\n          source[Symbol.asyncIterator](),\n          new RefCountList<TSource>(readerCount)\n        );\n    }\n    return create<TSource | TResult>(() =>\n      selector!(memoize<TSource>(readerCount)(source))[Symbol.asyncIterator]()\n    );\n  };\n}\n"]}