in lib/command_runner.dart [505:538]
int _editDistance(String from, String to) {
// Add a space in front to mimic indexing by 1 instead of 0.
from = ' $from';
to = ' $to';
var distances = [
for (var i = 0; i < from.length; i++)
[
for (var j = 0; j < to.length; j++)
if (i == 0) j else if (j == 0) i else 0,
],
];
for (var i = 1; i < from.length; i++) {
for (var j = 1; j < to.length; j++) {
// Removals from `from`.
var min = distances[i - 1][j] + 1;
// Additions to `from`.
min = math.min(min, distances[i][j - 1] + 1);
// Substitutions (and equality).
min = math.min(
min,
distances[i - 1][j - 1] +
// Cost is zero if substitution was not actually necessary.
(from[i] == to[j] ? 0 : 1));
// Allows for basic swaps, but no additional edits of swapped regions.
if (i > 1 && j > 1 && from[i] == to[j - 1] && from[i - 1] == to[j]) {
min = math.min(min, distances[i - 2][j - 2] + 1);
}
distances[i][j] = min;
}
}
return distances.last.last;
}