in native/desktop-macos/src/macos/application_menu.rs [459:514]
fn edit_operations<T: Eq>(source: &[T], target: &[T]) -> Vec<Operation> {
let m = source.len();
let n = target.len();
let mut dp = vec![vec![0; n + 1]; m + 1];
for i in 1..=m {
for j in 1..=n {
if source[i - 1] == target[j - 1] {
dp[i][j] = dp[i - 1][j - 1] + 1;
} else {
dp[i][j] = dp[i - 1][j].max(dp[i][j - 1]);
}
}
}
let mut operations = Vec::new();
let mut i = m;
let mut j = n;
while i > 0 && j > 0 {
if source[i - 1] == target[j - 1] {
operations.push(Operation::Reconcile {
position: i - 1,
item_idx: j - 1,
});
i -= 1;
j -= 1;
} else if dp[i - 1][j] > dp[i][j - 1] {
operations.push(Operation::Remove { position: i - 1 });
i -= 1;
} else {
operations.push(Operation::Insert {
position: i,
item_idx: j - 1,
});
j -= 1;
}
}
while i > 0 {
operations.push(Operation::Remove { position: i - 1 });
i -= 1;
}
while j > 0 {
operations.push(Operation::Insert {
position: i,
item_idx: j - 1,
});
j -= 1;
}
operations.reverse();
operations
}