///|
fn[T : Eq + Hash] find_unique(
  old~ : ArrayView[T],
  new~ : ArrayView[T],
) -> Array[(Int, Int)] {
  struct CountRecord {
    old_idx : Int
    mut old_count : Int
    mut new_idx : Int
    mut new_count : Int
  }
  let match_lines = @hashmap.new()
  for i = 0; i < old.length(); i = i + 1 {
    if match_lines.contains(old[i]) {
      let count_record : CountRecord = match_lines.get(old[i]).unwrap()
      count_record.old_count = count_record.old_count + 1
    } else {
      match_lines[old[i]] = CountRecord::{
        old_idx: i,
        old_count: 1,
        new_idx: -1,
        new_count: 0,
      }
    }
  }
  for i = 0; i < new.length(); i = i + 1 {
    if match_lines.contains(new[i]) {
      let count_record = match_lines.get(new[i]).unwrap()
      count_record.new_count = count_record.new_count + 1
      if count_record.new_idx == -1 {
        count_record.new_idx = i
      }
    }
  }
  let match_lines = match_lines
    .iter()
    .filter(p => p.1.new_count == 1 && p.1.old_count == 1)
  let unique_match_lines = []
  for pair in match_lines {
    let (_, record) = pair
    unique_match_lines.push((record.old_idx, record.new_idx))
  }
  unique_match_lines.sort_by_key(pair => pair.0)
  return unique_match_lines
}