///|
/// Structured run-loop progress snapshot emitted during long-running execution.
pub(all) struct RunProgress {
  cycles_completed : Int64
  cycles_ok : Int
  cycles_requested : Int?
  until_fault : Bool
  cycle_period_ns : Int64
  output_period_ns : Int
  telemetry : Telemetry
  consecutive_timeouts : Int
} derive(Debug)

///|
/// RunProgressSink receives structured run-loop progress events.
pub(open) trait RunProgressSink {
  fn emit(Self, RunProgress) -> Unit
}

///|
/// Default no-op sink for library callers that do not need progress events.
pub struct NullRunProgressSink {
  _unused : Unit
}

///|
pub fn NullRunProgressSink::new() -> NullRunProgressSink {
  { _unused: () }
}

///|
pub impl RunProgressSink for NullRunProgressSink with fn emit(self, progress) {
  ignore(self)
  ignore(progress)
}