use visit instead of apply_visitor in coroutine_observable