| 2513 | * ``` |
| 2514 | */ |
| 2515 | export function effectify<T>(promise: Promise<T>): Effected<never, T> { |
| 2516 | return effected(() => { |
| 2517 | let state = 0; |
| 2518 | return { |
| 2519 | next: (...args) => { |
| 2520 | switch (state) { |
| 2521 | case 0: |
| 2522 | state++; |
| 2523 | return { |
| 2524 | done: false, |
| 2525 | value: { |
| 2526 | _effectAsync: true, |
| 2527 | onComplete: ( |
| 2528 | ...args: [onComplete: (value: T) => void, onThrow?: (value: unknown) => void] |
| 2529 | ) => promise.then(...args), |
| 2530 | } as never, |
| 2531 | }; |
| 2532 | case 1: |
| 2533 | state++; |
| 2534 | return { |
| 2535 | done: true, |
| 2536 | ...(args.length > 0 ? { value: args[0] } : {}), |
| 2537 | } as IteratorReturnResult<T>; |
| 2538 | default: |
| 2539 | return { done: true } as IteratorReturnResult<T>; |
| 2540 | } |
| 2541 | }, |
| 2542 | }; |
| 2543 | }); |
| 2544 | } |
| 2545 | |
| 2546 | /** |
| 2547 | * Run an effected program synchronously and return its result. |