///|
fn text(value : String) -> String {
  value
}

///|
fn int_text(value : Int) -> String {
  "\{value}"
}

///|
fn reducer(
  state : Int,
  event : @replay.JournalEvent[String],
) -> @replay.Transition[Int] {
  if event.payload == "inc" {
    @replay.Transition::Accepted(state + 1)
  } else {
    @replay.Transition::Rejected("unexpected workload event")
  }
}

///|
fn main {
  let event_count = 10000
  let journal : @replay.Journal[String] = @replay.Journal::new()
  for index = 0; index < event_count; index = index + 1 {
    ignore(journal.append("Increment", "inc", "workload-1", text))
  }
  let report = @replay.replay(journal, 0, text, int_text, reducer)
  let evidence = @replay.build_replay_evidence(journal, report, text).unwrap()
  let proof = @replay.replay_inclusion_proof(
    journal, report, evidence, event_count,
  ).unwrap()
  println("events=\{journal.length()}")
  println("final_state=\{report.final_state}")
  println("state_hash=\{report.final_state_hash}")
  println("journal_hash=\{report.journal_tail_hash}")
  println("evidence_root=\{evidence.root}")
  println("evidence_levels=\{evidence.levels.length()}")
  println("proof_depth=\{proof.siblings.length()}")
  println("proof_verified=\{@replay.verify_replay_inclusion(proof)}")
  println(
    "deterministic=\{@replay.verify_determinism(journal, 0, text, int_text, reducer)}",
  )
}