///|
fn matching_chunks(
  left_bytes : Array[Int],
  left : Array[@hash.ChunkFingerprint],
  right_bytes : Array[Int],
  right : Array[@hash.ChunkFingerprint],
) -> Int {
  @hash.verified_chunk_matches(left_bytes, left, right_bytes, right).length()
}

///|
fn main {
  let original : Array[Int] = []
  for i = 0; i < 32768; i = i + 1 {
    original.push((i * 37 + i / 11 + i / 97) % 251)
  }
  let edited : Array[Int] = []
  for i = 0; i < original.length(); i = i + 1 {
    if i == 100 {
      edited.push(99)
    }
    edited.push(original[i])
  }
  let fixed_original = @hash.chunk_fingerprints(original, 256)
  let fixed_edited = @hash.chunk_fingerprints(edited, 256)
  let config = @hash.CdcConfig::new(128, 256, 512, 32)
  let cdc_original = @hash.content_defined_chunks(original, config)
  let cdc_edited = @hash.content_defined_chunks(edited, config)
  println("strategy,original_chunks,edited_chunks,reused_chunks")
  println(
    "fixed-256,\{fixed_original.length()},\{fixed_edited.length()},\{matching_chunks(original, fixed_original, edited, fixed_edited)}",
  )
  println(
    "cdc-128-256-512,\{cdc_original.length()},\{cdc_edited.length()},\{matching_chunks(original, cdc_original, edited, cdc_edited)}",
  )
  println(
    "fixed_missing_from_edited=\{@hash.missing_fixed_chunks(original, edited, 256).length()}",
  )
}