Skip to content

Commit 8192a4f

Browse files
committed
simpler version
1 parent 764701d commit 8192a4f

File tree

1 file changed

+10
-26
lines changed

1 file changed

+10
-26
lines changed

packages/kit/src/utils/streaming.js

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -9,48 +9,32 @@ import { with_resolvers } from './promise.js';
99
* }}
1010
*/
1111
export function create_async_iterator() {
12-
let count = 0;
13-
let accessed = false;
12+
let resolved = -1;
13+
let returned = -1;
1414

15-
const deferred = [with_resolvers()];
15+
/** @type {import('./promise.js').PromiseWithResolvers<T>[]} */
16+
const deferred = [];
1617

1718
return {
1819
iterate: (transform = (x) => x) => {
1920
return {
2021
[Symbol.asyncIterator]() {
21-
accessed = true;
22-
if (count === 0) {
23-
deferred[deferred.length - 1].resolve({ done: true });
24-
}
25-
2622
return {
2723
next: async () => {
28-
const next = await deferred[0].promise;
29-
30-
if (!next.done) {
31-
deferred.shift();
32-
return { value: transform(next.value), done: false };
33-
}
24+
const next = deferred[++returned];
25+
if (!next) return { value: null, done: true };
3426

35-
return next;
27+
const value = await next.promise;
28+
return { value: transform(value), done: false };
3629
}
3730
};
3831
}
3932
};
4033
},
4134
add: (promise) => {
42-
count += 1;
43-
35+
deferred.push(with_resolvers());
4436
void promise.then((value) => {
45-
deferred[deferred.length - 1].resolve({
46-
value,
47-
done: false
48-
});
49-
deferred.push(with_resolvers());
50-
51-
if (--count === 0 && accessed) {
52-
deferred[deferred.length - 1].resolve({ done: true });
53-
}
37+
deferred[++resolved].resolve(value);
5438
});
5539
}
5640
};

0 commit comments

Comments
 (0)