@@ -4,153 +4,20 @@ import { describe, it } from 'mocha';
44import { flattenAsyncIterable } from '../flattenAsyncIterable' ;
55
66describe ( 'flattenAsyncIterable' , ( ) => {
7- it ( 'does not modify an already flat async generator' , async ( ) => {
8- async function * source ( ) {
9- yield await Promise . resolve ( 1 ) ;
10- yield await Promise . resolve ( 2 ) ;
11- yield await Promise . resolve ( 3 ) ;
12- }
13-
14- const result = flattenAsyncIterable ( source ( ) ) ;
15-
16- expect ( await result . next ( ) ) . to . deep . equal ( { value : 1 , done : false } ) ;
17- expect ( await result . next ( ) ) . to . deep . equal ( { value : 2 , done : false } ) ;
18- expect ( await result . next ( ) ) . to . deep . equal ( { value : 3 , done : false } ) ;
19- expect ( await result . next ( ) ) . to . deep . equal ( {
20- value : undefined ,
21- done : true ,
22- } ) ;
23- } ) ;
24-
25- it ( 'does not modify an already flat async iterator' , async ( ) => {
26- const items = [ 1 , 2 , 3 ] ;
27-
28- const iterator : any = {
29- [ Symbol . asyncIterator ] ( ) {
30- return this ;
31- } ,
32- next ( ) {
33- return Promise . resolve ( {
34- done : items . length === 0 ,
35- value : items . shift ( ) ,
36- } ) ;
37- } ,
38- } ;
39-
40- const result = flattenAsyncIterable ( iterator ) ;
41-
42- expect ( await result . next ( ) ) . to . deep . equal ( { value : 1 , done : false } ) ;
43- expect ( await result . next ( ) ) . to . deep . equal ( { value : 2 , done : false } ) ;
44- expect ( await result . next ( ) ) . to . deep . equal ( { value : 3 , done : false } ) ;
45- expect ( await result . next ( ) ) . to . deep . equal ( {
46- value : undefined ,
47- done : true ,
48- } ) ;
49- } ) ;
50-
51- it ( 'flatten nested async generators' , async ( ) => {
52- async function * source ( ) {
53- yield await Promise . resolve ( 1 ) ;
54- yield await Promise . resolve ( 2 ) ;
55- yield await Promise . resolve (
56- ( async function * nested ( ) : AsyncGenerator < number , void , void > {
57- yield await Promise . resolve ( 2.1 ) ;
58- yield await Promise . resolve ( 2.2 ) ;
59- } ) ( ) ,
60- ) ;
61- yield await Promise . resolve ( 3 ) ;
62- }
63-
64- const doubles = flattenAsyncIterable ( source ( ) ) ;
65-
66- const result = [ ] ;
67- for await ( const x of doubles ) {
68- result . push ( x ) ;
69- }
70- expect ( result ) . to . deep . equal ( [ 1 , 2 , 2.1 , 2.2 , 3 ] ) ;
71- } ) ;
72-
73- it ( 'allows returning early from a nested async generator' , async ( ) => {
7+ it ( 'completely yields sub-iterables even when next() called in parallel' , async ( ) => {
748 async function * source ( ) {
75- yield await Promise . resolve ( 1 ) ;
76- yield await Promise . resolve ( 2 ) ;
779 yield await Promise . resolve (
7810 ( async function * nested ( ) : AsyncGenerator < number , void , void > {
79- yield await Promise . resolve ( 2.1 ) ; /* c8 ignore start */
80- // Not reachable, early return
81- yield await Promise . resolve ( 2.2 ) ;
11+ yield await Promise . resolve ( 1.1 ) ;
12+ yield await Promise . resolve ( 1.2 ) ;
8213 } ) ( ) ,
8314 ) ;
84- // Not reachable, early return
85- yield await Promise . resolve ( 3 ) ;
86- }
87- /* c8 ignore stop */
88-
89- const doubles = flattenAsyncIterable ( source ( ) ) ;
90-
91- expect ( await doubles . next ( ) ) . to . deep . equal ( { value : 1 , done : false } ) ;
92- expect ( await doubles . next ( ) ) . to . deep . equal ( { value : 2 , done : false } ) ;
93- expect ( await doubles . next ( ) ) . to . deep . equal ( { value : 2.1 , done : false } ) ;
94-
95- // Early return
96- expect ( await doubles . return ( ) ) . to . deep . equal ( {
97- value : undefined ,
98- done : true ,
99- } ) ;
100-
101- // Subsequent next calls
102- expect ( await doubles . next ( ) ) . to . deep . equal ( {
103- value : undefined ,
104- done : true ,
105- } ) ;
106- expect ( await doubles . next ( ) ) . to . deep . equal ( {
107- value : undefined ,
108- done : true ,
109- } ) ;
110- } ) ;
111-
112- it ( 'allows throwing errors from a nested async generator' , async ( ) => {
113- async function * source ( ) {
114- yield await Promise . resolve ( 1 ) ;
115- yield await Promise . resolve ( 2 ) ;
11615 yield await Promise . resolve (
11716 ( async function * nested ( ) : AsyncGenerator < number , void , void > {
118- yield await Promise . resolve ( 2.1 ) ; /* c8 ignore start */
119- // Not reachable, early return
17+ yield await Promise . resolve ( 2.1 ) ;
12018 yield await Promise . resolve ( 2.2 ) ;
12119 } ) ( ) ,
12220 ) ;
123- // Not reachable, early return
124- yield await Promise . resolve ( 3 ) ;
125- }
126- /* c8 ignore stop */
127-
128- const doubles = flattenAsyncIterable ( source ( ) ) ;
129-
130- expect ( await doubles . next ( ) ) . to . deep . equal ( { value : 1 , done : false } ) ;
131- expect ( await doubles . next ( ) ) . to . deep . equal ( { value : 2 , done : false } ) ;
132- expect ( await doubles . next ( ) ) . to . deep . equal ( { value : 2.1 , done : false } ) ;
133-
134- // Throw error
135- let caughtError ;
136- try {
137- await doubles . throw ( 'ouch' ) ; /* c8 ignore start */
138- // Not reachable, always throws
139- /* c8 ignore stop */
140- } catch ( e ) {
141- caughtError = e ;
142- }
143- expect ( caughtError ) . to . equal ( 'ouch' ) ;
144- } ) ;
145- it ( 'completely yields sub-iterables even when next() called in parallel' , async ( ) => {
146- async function * source ( ) {
147- yield await Promise . resolve (
148- ( async function * nested ( ) : AsyncGenerator < number , void , void > {
149- yield await Promise . resolve ( 1.1 ) ;
150- yield await Promise . resolve ( 1.2 ) ;
151- } ) ( ) ,
152- ) ;
153- yield await Promise . resolve ( 2 ) ;
15421 }
15522
15623 const result = flattenAsyncIterable ( source ( ) ) ;
@@ -159,7 +26,8 @@ describe('flattenAsyncIterable', () => {
15926 const promise2 = result . next ( ) ;
16027 expect ( await promise1 ) . to . deep . equal ( { value : 1.1 , done : false } ) ;
16128 expect ( await promise2 ) . to . deep . equal ( { value : 1.2 , done : false } ) ;
162- expect ( await result . next ( ) ) . to . deep . equal ( { value : 2 , done : false } ) ;
29+ expect ( await result . next ( ) ) . to . deep . equal ( { value : 2.1 , done : false } ) ;
30+ expect ( await result . next ( ) ) . to . deep . equal ( { value : 2.2 , done : false } ) ;
16331 expect ( await result . next ( ) ) . to . deep . equal ( {
16432 value : undefined ,
16533 done : true ,
0 commit comments