Свой оптимум я нашел. Переход между состояниями - банальный goto,
внутри состояния установка новых значений выходов, после чего
while(1){ yield(); if(условия переходов в другие состояния){
goto...}}; Описание достаточно компактное и читабельное. Минимум
дополнительных абстракций.