/* define an Observer */ template concept Observer = requires(Obs obs, unsigned int t, view_constgbx gbxs, view_constsupers supers) { { obs.before_timestepping(gbxs) } -> std::same_as; { obs.after_timestepping() } -> std::same_as; { obs.next_step(t) } -> std::convertible_to; { obs.on_step(t) } -> std::same_as; { obs.at_start_step(t, gbxs, supers) } -> std::same_as; { obs.get_monitor() }; // should return a Monitor type };