1- import type { QuansyncAwaitableGenerator , QuansyncFn , QuansyncGenerator , QuansyncGeneratorFn , QuansyncInput , QuansyncInputObject } from './types'
1+ import type { QuansyncAwaitableGenerator , QuansyncFn , QuansyncGenerator , QuansyncGeneratorFn , QuansyncInput , QuansyncInputObject , QuansyncOptions } from './types'
22
33export * from './types'
44
@@ -59,11 +59,16 @@ function unwrapYield(value: any, isAsync?: boolean): any {
5959 return value
6060}
6161
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 {
6368 let current = generator . next ( )
6469 while ( ! current . done ) {
6570 try {
66- current = generator . next ( unwrapYield ( current . value ) )
71+ current = generator . next ( unwrapYield ( onYield ( current . value , false ) ) )
6772 }
6873 catch ( err ) {
6974 current = generator . throw ( err )
@@ -72,11 +77,14 @@ function iterateSync<Return>(generator: QuansyncGenerator<Return, unknown>): Ret
7277 return unwrapYield ( current . value )
7378}
7479
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 > {
7684 let current = generator . next ( )
7785 while ( ! current . done ) {
7886 try {
79- current = generator . next ( await unwrapYield ( current . value , true ) )
87+ current = generator . next ( await unwrapYield ( onYield ( current . value , true ) , true ) )
8088 }
8189 catch ( err ) {
8290 current = generator . throw ( err )
@@ -87,14 +95,15 @@ async function iterateAsync<Return>(generator: QuansyncGenerator<Return, unknown
8795
8896function fromGeneratorFn < Return , Args extends any [ ] > (
8997 generatorFn : QuansyncGeneratorFn < Return , Args > ,
98+ options ?: QuansyncOptions ,
9099) : QuansyncFn < Return , Args > {
91100 return fromObject ( {
92101 name : generatorFn . name ,
93102 async ( ...args ) {
94- return iterateAsync ( generatorFn . apply ( this , args ) )
103+ return iterateAsync ( generatorFn . apply ( this , args ) , options ?. onYield )
95104 } ,
96105 sync ( ...args ) {
97- return iterateSync ( generatorFn . apply ( this , args ) )
106+ return iterateSync ( generatorFn . apply ( this , args ) , options ?. onYield )
98107 } ,
99108 } )
100109}
@@ -103,14 +112,22 @@ function fromGeneratorFn<Return, Args extends any[]>(
103112 * Creates a new Quansync function, a "superposition" between async and sync.
104113 */
105114export 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 ,
107124) : 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 )
112129 else
113- return fromObject ( options )
130+ return fromObject ( input )
114131}
115132
116133/**
0 commit comments