What makes an approach better or worse is how easily it leads to a good implementation.
One typical issue is that possible values of variables are larger/wider than the correct ones for states. These needs to be tried to contrained and compilers can’t help with this at all.
Another issue may be how to implement constrains of state transitions, which also relies on implementations only.
3rd, changing states in-place makes state-tracking a must.
Making states as parameters to be passed in is a way to avoid tracking them within functions.
Use types of parameters can avoid inconsistency of state transitions.