# Keep one process for a step loop

`coproc` holds one `choose` process open. `--batch 1` prints each answer while the input stays open. The example replays a recording. It needs no key and no network. Use a library binding when each call must cost less time.

*steps.jsonl, a file the script reads*

```
{"id":"S-1","state":"A customer wrote to ask where their order is. Nothing has been looked up yet, and the message carries an order number.","actions":["look_up_the_order","ask_for_the_order_number","open_a_carrier_claim","close_the_ticket"]}
{"id":"S-2","state":"The order was found. It shipped nine days ago and the carrier's tracking has not moved for six days. The customer has not been told anything yet.","actions":["open_a_carrier_claim","send_the_tracking_link","ask_for_the_order_number","close_the_ticket"]}
{"id":"S-3","state":"The carrier confirmed in writing that the parcel is lost. The customer replied that they still want the item and do not want their money back.","actions":{"ship_a_replacement":"Send the same item again at no charge.","refund_the_order":"Give the money back and send nothing.","open_a_carrier_claim":"Ask the carrier to investigate the parcel.","close_the_ticket":"End the conversation with no further action."}}
```

*Three changing action lists produce three answers from one process.*

```
coproc PICK {
  thinkthen choose \
    'Which of these actions should be taken next?' \
    --jsonl --field /state --options /actions \
    --raw --batch 1 --replay recording
}
while IFS= read -r step; do
  printf '%s\n' "$step" >&"${PICK[1]}"
  IFS= read -r chosen <&"${PICK[0]}" || exit 1
  printf '%s\n' "$chosen"
done < steps.jsonl
exec {PICK[1]}>&-
wait "$PICK_PID"
```

*Output*

```
look_up_the_order
open_a_carrier_claim
ship_a_replacement
```

*exit 0*

On GitHub: [github.com/botassembly/thinkthen](https://github.com/botassembly/thinkthen)
