UNPKG

2.12 kBJavaScriptView Raw
1import { AsyncIterableX } from './asynciterablex';
2import { MaxRefCountList, RefCountList } from '../iterable/_refcountlist';
3import { create } from './create';
4export class MemoizeAsyncBuffer extends AsyncIterableX {
5 constructor(source, buffer) {
6 super();
7 this._stopped = false;
8 this._source = source;
9 this._buffer = buffer;
10 }
11 async *[Symbol.asyncIterator]() {
12 let i = 0;
13 try {
14 while (1) {
15 let hasValue = false, current = {};
16 if (i >= this._buffer.count) {
17 if (!this._stopped) {
18 try {
19 let next = await this._source.next();
20 hasValue = !next.done;
21 if (hasValue) {
22 current = next.value;
23 }
24 }
25 catch (e) {
26 this._error = e;
27 this._stopped = true;
28 }
29 }
30 if (this._stopped) {
31 throw this._error;
32 }
33 if (hasValue) {
34 this._buffer.push(current);
35 }
36 }
37 else {
38 hasValue = true;
39 }
40 if (hasValue) {
41 yield this._buffer.get(i);
42 }
43 else {
44 break;
45 }
46 i++;
47 }
48 }
49 finally {
50 this._buffer.done();
51 }
52 }
53}
54export function memoize(source, readerCount = -1, selector) {
55 if (!selector) {
56 return readerCount === -1
57 ? new MemoizeAsyncBuffer(source[Symbol.asyncIterator](), new MaxRefCountList())
58 : new MemoizeAsyncBuffer(source[Symbol.asyncIterator](), new RefCountList(readerCount));
59 }
60 return create(() => selector(memoize(source, readerCount))[Symbol.asyncIterator]());
61}
62
63//# sourceMappingURL=memoize.mjs.map