| 183 | ) |
| 184 | |
| 185 | const runWithInput = <Output>( |
| 186 | prompt: Prompt.Prompt<Output>, |
| 187 | terminal: Terminal.Terminal, |
| 188 | input: Mailbox.ReadonlyMailbox<Terminal.UserInput> |
| 189 | ): Effect.Effect<Output, Cause.NoSuchElementException, Prompt.Prompt.Environment> => |
| 190 | Effect.suspend(() => { |
| 191 | const op = prompt as Primitive |
| 192 | switch (op._tag) { |
| 193 | case "Loop": { |
| 194 | return runLoop(op, terminal, input) |
| 195 | } |
| 196 | case "OnSuccess": { |
| 197 | return Effect.flatMap( |
| 198 | runWithInput(op.prompt, terminal, input), |
| 199 | (a) => runWithInput(op.onSuccess(a), terminal, input) |
| 200 | ) as any |
| 201 | } |
| 202 | case "Succeed": { |
| 203 | return Effect.succeed(op.value) |
| 204 | } |
| 205 | } |
| 206 | }) |
| 207 | |
| 208 | const runLoop = Effect.fnUntraced( |
| 209 | function*( |