It would be interesting to have polytyped coroutines, where each poll(r:R1) returns a sum type over some subset of poll()able objects that each take their own R2, R3, etc
At some point maybe the ergonomics get so bad that you are just better off writing the state machine manually.
The ergonomics of this could be made reasonably friendly if your completeness checker can narrow down the set of admissible matches a la "GADTs meet their match". A single R sum type, but the compiler only makes you handle the cases that can occur at each poll() site