`dam_lev` implements the [Damerau–Levenshtein diff algorithm](https://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance). That is, it takes two sequences and determines the minimum number of transpositions, substitutions, insertions, and deletions needed to transform the first sequence into the second.
# Usage
`dam_lev::diff` takes two slices of some type `T` which implements `Clone + PartialEq` and returns a vector of `dam_lev::Mutation` objects. This is an enum type with four variants corresponding to the four types of transformations. For example,
```rust
use dam_lev::Mutation::*;
let seq1 = ['a', 'b', 'c', 'd', 'e', 'f'];
let seq2 = ['b', 'c', 'e', 'd', 'x', 'y'];
let diffs = dam_lev::diff(&seq1, &seq2);
assert_eq!(diffs, vec![Deletion(0), Transposition(3), Substitution(5, 4), Insertion(6, 5)]);
```
We see that the sequence of transformations is
* Delete the item at index 0 (`'a'`).
* Transpose the item at index 3 (`'d'`) with its successor.
* Substitute the item at index 5 (`'f'`) with the item from the second sequence at index 4 (`'x'`).
* Insert at index 6 the item from the second sequence at index 5 (`'y'`).
Note the index for the transposition. Even though, after the deletion, the `'d'` is at index 2, it's at index 3 in the original version of the sequence. Likewise for the successive mutations.
## Compare function
If you want to customize how the items are compared, you can use `diff_with_compare`:
```rust
let seq1 = [1, 2, 3];
let seq2 = [91, 92, 93];
assert_eq!(diffs.len(), 0);
```
In this case, the items must only implement `Clone` and `compare` must be of type `FnMut(&T, &T) -> bool`.