///|
pub fn[T : Eq + Hash] longest_unique_matching_subsequence(
  old~ : ArrayView[T],
  new~ : ArrayView[T],
) -> Array[(Int, Int)] {
  let matchs = find_unique(old~, new~)
  let piles : Piles[BackPointer[(Int, Int)]] = Array::new(
    capacity=matchs.length(),
  )
  for place = 0; place < matchs.length(); place = place + 1 {
    let (_, new_idx) = matchs[place]
    if piles.is_empty() {
      piles.put_back(BackPointer::{ value: (new_idx, place), prev: None })
    } else {
      piles.put_by_binary_search(new_idx~, place~)
    }
  }
  guard piles.last() is Some(head) else { return [] }
  let seq = []
  for pair in head.top.to_array().iter() {
    let (_, place) = pair
    seq.push(matchs[place])
  }
  return seq
}