MCPcopy Create free account
hub / github.com/Snowflyt/tinyeffect / iterate

Function iterate

src/effected.ts:2625–2697  ·  view source on GitHub ↗
(...args: [] | [unknown])

Source from the content-addressed store, hash-verified

2623
2624 return new Promise((resolve, reject) => {
2625 const iterate = (...args: [] | [unknown]) => {
2626 if (context.terminated) return context.terminatedValue;
2627
2628 let done: boolean | undefined;
2629 let value: any;
2630 try {
2631 ({ done, value } = (context.interceptIterator || iterator).next(...args));
2632 } catch (e) {
2633 // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors
2634 reject(e);
2635 return;
2636 }
2637
2638 // We use a while loop to avoid stack overflow when there are many synchronous effects
2639 while (!done) {
2640 if (!value) {
2641 reject(
2642 new Error(
2643 `Invalid effected program: an effected program should yield only effects (received ${stringify(value)})`,
2644 ),
2645 );
2646 return;
2647 }
2648 if (value instanceof Effect) {
2649 while (value instanceof Effect && typeof (value as any).defaultHandler === "function") {
2650 value = handleEffect(context, effect.name, value, (value as any).defaultHandler).value;
2651 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
2652 if (context.terminated) return context.terminatedValue;
2653 }
2654 if (value instanceof Effect) {
2655 reject(new UnhandledEffectError(value, `Unhandled effect: ${stringifyEffect(value)}`));
2656 return;
2657 }
2658 }
2659 if (value._effectSync) {
2660 try {
2661 ({ done, value } = (context.interceptIterator || iterator).next(
2662 ...("value" in value ? [value.value] : []),
2663 ));
2664 } catch (e) {
2665 // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors
2666 reject(e);
2667 return;
2668 }
2669 continue;
2670 }
2671 if (value._effectAsync) {
2672 if (value.interruptable) {
2673 let resolve!: (value: unknown) => void;
2674 const promise = new Promise((_resolve) => (resolve = _resolve));
2675 // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors
2676 value.onComplete(resolve, (...args: unknown[]) => reject(...args.slice(0, 1)));
2677 ({ done, value } = (context.interceptIterator || iterator).next({
2678 _effectInterrupt: value.interruptable,
2679 with: promise,
2680 }));
2681 continue;
2682 } else {

Callers 1

runAsyncFunction · 0.70

Calls 3

handleEffectFunction · 0.85
stringifyEffectFunction · 0.85
stringifyFunction · 0.70

Tested by

no test coverage detected