File tree Expand file tree Collapse file tree 1 file changed +10
-26
lines changed Expand file tree Collapse file tree 1 file changed +10
-26
lines changed Original file line number Diff line number Diff line change @@ -9,48 +9,32 @@ import { with_resolvers } from './promise.js';
99 * }}
1010 */
1111export 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 } ;
You can’t perform that action at this time.
0 commit comments