| 110 | <Payloads extends unknown[], R>(...payloads: Payloads) => Effected<Effect<Name, Payloads, R>, R> |
| 111 | : (...payloads: Payloads) => Effected<Default<Effect<Name, Payloads, R>, T, F>, R>; |
| 112 | export function effect(...args: unknown[]): any { |
| 113 | if (args.length === 0) return effect; |
| 114 | const [name, options = {}] = args as [ |
| 115 | name: string | symbol, |
| 116 | options?: { |
| 117 | resumable?: boolean; |
| 118 | defaultHandler?: (context: any, ...args: unknown[]) => unknown; |
| 119 | }, |
| 120 | ]; |
| 121 | const result = (...payloads: unknown[]) => { |
| 122 | const defaultHandler = |
| 123 | options.defaultHandler && |
| 124 | ((context: any, ...payloads: unknown[]) => options.defaultHandler!(context, ...payloads)); |
| 125 | return effected(() => { |
| 126 | let state = 0; |
| 127 | return { |
| 128 | next: (...args) => { |
| 129 | switch (state) { |
| 130 | case 0: |
| 131 | state++; |
| 132 | return { |
| 133 | done: false, |
| 134 | value: Object.assign(new Effect(name, payloads), { |
| 135 | ...(options.resumable === false ? { resumable: false } : {}), |
| 136 | ...(defaultHandler ? { defaultHandler } : {}), |
| 137 | }), |
| 138 | }; |
| 139 | case 1: |
| 140 | state++; |
| 141 | return { |
| 142 | done: true, |
| 143 | ...(args.length > 0 ? { value: args[0] } : {}), |
| 144 | } as IteratorReturnResult<unknown>; |
| 145 | default: |
| 146 | return { done: true } as IteratorReturnResult<unknown>; |
| 147 | } |
| 148 | }, |
| 149 | }; |
| 150 | }); |
| 151 | }; |
| 152 | if ((options as any)._overrideFunctionName === false) return result as never; |
| 153 | return renameFunction( |
| 154 | result, |
| 155 | typeof name === "string" ? name : name.toString().slice(7, -1) || "", |
| 156 | ) as never; |
| 157 | } |
| 158 | |
| 159 | /** |
| 160 | * Create a function that returns an {@link Effected} instance (an effected program) which yields a |