///|
fn main {
  let sim = @moonsim.Sim::new(seed=2026UL)
  let mut tick = 0
  let mut backoff = 1

  for attempt in 1..<=4 {
    ignore(sim.schedule_at(tick, "attempt:" + attempt.to_string()))
    sim.inc_counter("attempts")
    let jitter = sim.next_int(2)
    if attempt < 3 {
      ignore(
        sim.schedule_at(tick, "attempt:" + attempt.to_string() + ":failed"),
      )
      tick += backoff + jitter
      backoff = backoff * 2
      sim.inc_counter("retries")
    } else {
      ignore(
        sim.schedule_at(tick, "attempt:" + attempt.to_string() + ":succeeded"),
      )
      sim.inc_counter("success")
      break
    }
  }

  ignore(sim.run_until_idle())
  println("retry simulation")
  println("attempts=" + sim.metrics().counter("attempts").to_string())
  println("retries=" + sim.metrics().counter("retries").to_string())
  println("success=" + sim.metrics().counter("success").to_string())
  println(
    "events_executed=" + sim.metrics().counter("events_executed").to_string(),
  )
  println("final_tick=" + sim.time().to_string())
  println("digest=" + sim.digest().to_string())
}