1
- import type { QuansyncAwaitableGenerator , QuansyncFn , QuansyncGenerator , QuansyncGeneratorFn , QuansyncInput , QuansyncInputObject } from './types'
1
+ import type { QuansyncAwaitableGenerator , QuansyncFn , QuansyncGenerator , QuansyncGeneratorFn , QuansyncInput , QuansyncInputObject , QuansyncOptions } from './types'
2
2
3
3
export * from './types'
4
4
@@ -59,11 +59,16 @@ function unwrapYield(value: any, isAsync?: boolean): any {
59
59
return value
60
60
}
61
61
62
- function iterateSync < Return > ( generator : QuansyncGenerator < Return , unknown > ) : Return {
62
+ const DEFAULT_ON_YIELD = ( value : any ) : any => value
63
+
64
+ function iterateSync < Return > (
65
+ generator : QuansyncGenerator < Return , unknown > ,
66
+ onYield : QuansyncOptions [ 'onYield' ] = DEFAULT_ON_YIELD ,
67
+ ) : Return {
63
68
let current = generator . next ( )
64
69
while ( ! current . done ) {
65
70
try {
66
- current = generator . next ( unwrapYield ( current . value ) )
71
+ current = generator . next ( unwrapYield ( onYield ( current . value , false ) ) )
67
72
}
68
73
catch ( err ) {
69
74
current = generator . throw ( err )
@@ -72,11 +77,14 @@ function iterateSync<Return>(generator: QuansyncGenerator<Return, unknown>): Ret
72
77
return unwrapYield ( current . value )
73
78
}
74
79
75
- async function iterateAsync < Return > ( generator : QuansyncGenerator < Return , unknown > ) : Promise < Return > {
80
+ async function iterateAsync < Return > (
81
+ generator : QuansyncGenerator < Return , unknown > ,
82
+ onYield : QuansyncOptions [ 'onYield' ] = DEFAULT_ON_YIELD ,
83
+ ) : Promise < Return > {
76
84
let current = generator . next ( )
77
85
while ( ! current . done ) {
78
86
try {
79
- current = generator . next ( await unwrapYield ( current . value , true ) )
87
+ current = generator . next ( await unwrapYield ( onYield ( current . value , true ) , true ) )
80
88
}
81
89
catch ( err ) {
82
90
current = generator . throw ( err )
@@ -87,14 +95,15 @@ async function iterateAsync<Return>(generator: QuansyncGenerator<Return, unknown
87
95
88
96
function fromGeneratorFn < Return , Args extends any [ ] > (
89
97
generatorFn : QuansyncGeneratorFn < Return , Args > ,
98
+ options ?: QuansyncOptions ,
90
99
) : QuansyncFn < Return , Args > {
91
100
return fromObject ( {
92
101
name : generatorFn . name ,
93
102
async ( ...args ) {
94
- return iterateAsync ( generatorFn . apply ( this , args ) )
103
+ return iterateAsync ( generatorFn . apply ( this , args ) , options ?. onYield )
95
104
} ,
96
105
sync ( ...args ) {
97
- return iterateSync ( generatorFn . apply ( this , args ) )
106
+ return iterateSync ( generatorFn . apply ( this , args ) , options ?. onYield )
98
107
} ,
99
108
} )
100
109
}
@@ -103,14 +112,22 @@ function fromGeneratorFn<Return, Args extends any[]>(
103
112
* Creates a new Quansync function, a "superposition" between async and sync.
104
113
*/
105
114
export function quansync < Return , Args extends any [ ] = [ ] > (
106
- options : QuansyncInput < Return , Args > | Promise < Return > ,
115
+ input : QuansyncInputObject < Return , Args > ,
116
+ ) : QuansyncFn < Return , Args >
117
+ export function quansync < Return , Args extends any [ ] = [ ] > (
118
+ input : QuansyncGeneratorFn < Return , Args > | Promise < Return > ,
119
+ options ?: QuansyncOptions ,
120
+ ) : QuansyncFn < Return , Args >
121
+ export function quansync < Return , Args extends any [ ] = [ ] > (
122
+ input : QuansyncInput < Return , Args > | Promise < Return > ,
123
+ options ?: QuansyncOptions ,
107
124
) : QuansyncFn < Return , Args > {
108
- if ( isThenable ( options ) )
109
- return fromPromise < Return > ( options )
110
- if ( typeof options === 'function' )
111
- return fromGeneratorFn ( options )
125
+ if ( isThenable ( input ) )
126
+ return fromPromise < Return > ( input )
127
+ if ( typeof input === 'function' )
128
+ return fromGeneratorFn ( input , options )
112
129
else
113
- return fromObject ( options )
130
+ return fromObject ( input )
114
131
}
115
132
116
133
/**
0 commit comments