///|
fn workload(transactions : Int) -> Array[@journal.JournalRecord] {
  let records : Array[@journal.JournalRecord] = []
  let mut sequence = 1U
  for transaction = 1
      transaction <= transactions
      transaction = transaction + 1 {
    let id = transaction.reinterpret_as_uint()
    records.push(@journal.JournalRecord::new(Begin, sequence, id))
    sequence += 1U
    records.push(
      @journal.JournalRecord::new(
        Put,
        sequence,
        id,
        payload=@journal.encode_put_payload(b"bench-key", b"bench-value"),
      ),
    )
    sequence += 1U
    records.push(@journal.JournalRecord::new(Commit, sequence, id))
    sequence += 1U
  }
  records
}

///|
fn main {
  let records = workload(10000)
  let stream = @journal.encode_records(records)
  let scan = @journal.scan_journal(stream)
  let recovery = @journal.build_recovery_plan(scan.records)
  let segments = @journal.plan_segments(records, 1024 * 1024, 10000)
  let crash_sample = @journal.sweep_crash_cuts(workload(100))
  println("records=\{records.length()}")
  println("encoded_bytes=\{stream.length()}")
  println("scan=" + scan.to_json())
  println("recovery=" + recovery.to_json())
  println("segments=\{segments.segments.length()}")
  println("crash_sample=" + crash_sample.to_json())
}