Skip to content

Commit 1394948

Browse files
committed
fix: super charge returned function to support both async and iterator
1 parent 909c645 commit 1394948

File tree

2 files changed

+27
-9
lines changed

2 files changed

+27
-9
lines changed

src/index.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export type QuansyncGenerator<Return = any, Yield = unknown> =
2727
* "Superposition" function that can be consumed in both sync and async contexts.
2828
*/
2929
export type QuansyncFn<Return = any, Args extends any[] = []> =
30-
((...args: Args) => QuansyncGenerator<Return>)
30+
((...args: Args) => QuansyncGenerator<Return> & Promise<Return>)
3131
& {
3232
sync: (...args: Args) => Return
3333
async: (...args: Args) => Promise<Return>
@@ -53,12 +53,15 @@ function fromObject<Return, Args extends any[]>(
5353
async: (options.async as any).bind(null, ...args),
5454
__isQuansync: true,
5555
}
56-
} as unknown as QuansyncFn<Return, Args>
57-
58-
generator.sync = options.sync
59-
generator.async = options.async
60-
61-
return generator
56+
}
57+
const fn = (...args: Args): any => {
58+
const iter = generator(...args) as unknown as QuansyncGenerator<Return, Args> & Promise<Return>
59+
iter.then = fn => options.async(...args).then(fn)
60+
return iter
61+
}
62+
fn.sync = options.sync
63+
fn.async = options.async
64+
return fn
6265
}
6366

6467
function fromPromise<T>(promise: Promise<T> | T): QuansyncFn<T, []> {
@@ -135,8 +138,8 @@ export function quansync<Return, Args extends any[] = []>(
135138
*/
136139
export function quansyncMacro<Return, Args extends any[] = []>(
137140
options: QuansyncInput<Return, Args> | ((...args: Args) => Promise<Return> | Return),
138-
): QuansyncFn<Return, Args> {
139-
return quansync(options as any)
141+
): QuansyncFn<Return> {
142+
return quansync(options as any) as any
140143
}
141144

142145
/**

test/index.test.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,21 @@ it('generator', async () => {
5757
expect(await multiply.async(4, 5)).toBe('20')
5858
})
5959

60+
it('consume with await', async () => {
61+
const add = quansync({
62+
name: 'add',
63+
sync: (a: number, b: number) => a + b,
64+
async: async (a: number, b: number) => {
65+
await new Promise(resolve => setTimeout(resolve, 10))
66+
return a + b
67+
},
68+
})
69+
70+
expect(add(2, 3)).resolves.toBe(5)
71+
expect(add.sync(2, 6)).toBe(8)
72+
expect(add.async(2, 3)).resolves.toBe(5)
73+
})
74+
6075
it('yield optional promise', async () => {
6176
interface Transformer {
6277
transform: (code: string) => string | Promise<string>

0 commit comments

Comments
 (0)