Skip to content

Commit 2b7a7df

Browse files
authored
fix: let waitFor accept TaskBuilders, fix type issues (#7)
1 parent 4618630 commit 2b7a7df

File tree

4 files changed

+21
-9
lines changed

4 files changed

+21
-9
lines changed

src/Task.test.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1637,11 +1637,18 @@ test("The type-safe wrapper works correctly", async (t) => {
16371637
const scheduler = new TaskScheduler();
16381638
scheduler.start();
16391639

1640+
const inner = {
1641+
priority: TaskPriority.Normal,
1642+
task: async function* () {
1643+
return 42;
1644+
},
1645+
};
1646+
16401647
const task = scheduler.queueTask({
16411648
priority: TaskPriority.Normal,
16421649
task: async function* () {
16431650
const foo: string = yield* waitFor(Promise.resolve("bar"));
1644-
const baz: number = yield* waitFor(Promise.resolve(42));
1651+
const baz = yield* waitFor(inner);
16451652
return [foo, baz] as const;
16461653
},
16471654
});

src/Task.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,9 @@ export interface TaskBuilder<
7878
* Yielded Promises should not spawn new tasks. If they do, the spawned tasks MUST have a higher priority than the parent task.
7979
*/
8080
task: () => AsyncGenerator<
81-
| (() => Promise<TInner> | TaskBuilder<TReturn, TaskTag, TInner>)
82-
| (() => TaskBuilder<TReturn, TaskTag, TInner>)
83-
| TaskBuilder<TReturn, TaskTag, TInner>
81+
| (() => Promise<unknown> | TaskBuilder<unknown, TaskTag, unknown>)
82+
| (() => TaskBuilder<unknown, TaskTag, unknown>)
83+
| TaskBuilder<unknown, TaskTag, unknown>
8484
| undefined,
8585
TReturn,
8686
TInner

src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,4 @@ export {
99
type TaskStepResult,
1010
type TaskConcurrencyGroup,
1111
} from "./Task.js";
12-
export { waitFor } from "./utils.js";
12+
export { waitFor, type WaitForReturnType } from "./utils.js";

src/utils.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { type TaskBuilder } from "./Task.js";
2+
13
/** Returns a timestamp with nano-second precision */
24
export function highResTimestamp(): number {
35
if (typeof process !== "undefined") {
@@ -31,9 +33,12 @@ export function evalOrStatic<T>(
3133
return typeof fnOrConst === "function" ? fnOrConst(...args) : fnOrConst;
3234
}
3335

34-
export async function* waitFor<T>(
35-
promise: Promise<T>,
36-
): AsyncGenerator<() => Promise<T>, T> {
37-
const result = yield () => promise;
36+
export type WaitForReturnType<T> =
37+
T extends Promise<infer U> ? U : T extends TaskBuilder<infer U> ? U : never;
38+
39+
export async function* waitFor<
40+
T extends Promise<unknown> | TaskBuilder<unknown>,
41+
>(thing: T): AsyncGenerator<() => T, WaitForReturnType<T>> {
42+
const result = yield () => thing;
3843
return result;
3944
}

0 commit comments

Comments
 (0)