///|
fn print_edits(edits : Array[@diff.EditOp]) -> Unit {
  for edit in edits {
    match edit {
      Equal(character) => println("Equal(\{character})")
      Delete(character) => println("Delete(\{character})")
      Insert(character) => println("Insert(\{character})")
    }
  }
}

///|
fn main {
  let old_text = "Moon😀 diff"
  let new_text = "Moon🌕 patch"
  let edits = @diff.diff(old_text, new_text)
  print_edits(@diff.compact(edits))
  let summary = @diff.stats(edits)
  println(
    "equal=\{summary.equal_count}, deleted=\{summary.delete_count}, inserted=\{summary.insert_count}",
  )
  println("old round-trip: \{@diff.reconstruct_old(edits)}")
  println("new round-trip: \{@diff.reconstruct_new(edits)}")
  match @diff.apply(@diff.compact(edits), old_text) {
    Ok(result) => println("applied: \{result}")
    Err(_) => println("apply failed")
  }
  match @diff.apply(@diff.invert(edits), new_text) {
    Ok(result) => println("reverted: \{result}")
    Err(_) => println("revert failed")
  }
  println("")
  println(
    @diff.unified_diff_standard(
      "one\ntwo\nthree\n", "one\n2\nthree\n", "before.txt", "after.txt", 1,
    ),
  )
}