Skip to content

Commit c20839a

Browse files
authored
Merge pull request #38 from Tcode-Motion/bolt-optimize-levenshtein-cli-8922143708013747429
⚡ Bolt: Optimize Levenshtein calculation in CLI
2 parents 0ec0f9e + af1b360 commit c20839a

1 file changed

Lines changed: 14 additions & 8 deletions

File tree

‎cli/src/main.rs‎

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -267,14 +267,19 @@ capabilities = ["FileSystem", "Environment", "Process", "Network"]
267267
}
268268
}
269269

270-
fn levenshtein(a: &str, b: &str) -> usize {
271-
let mut cache = vec![0; b.len() + 1];
272-
for (i, val) in cache.iter_mut().enumerate() {
270+
fn levenshtein(a: &str, b: &str, cache: &mut [usize]) -> usize {
271+
let b_len = b.len();
272+
273+
// We only need bytes since commands are ascii
274+
let a_bytes = a.as_bytes();
275+
let b_bytes = b.as_bytes();
276+
277+
for (i, val) in cache[..=b_len].iter_mut().enumerate() {
273278
*val = i;
274279
}
275-
for (i, ca) in a.chars().enumerate() {
280+
for (i, &ca) in a_bytes.iter().enumerate() {
276281
let mut temp = i + 1;
277-
for (j, cb) in b.chars().enumerate() {
282+
for (j, &cb) in b_bytes.iter().enumerate() {
278283
let next = if ca == cb {
279284
cache[j]
280285
} else {
@@ -283,9 +288,9 @@ fn levenshtein(a: &str, b: &str) -> usize {
283288
cache[j] = temp;
284289
temp = next;
285290
}
286-
cache[b.len()] = temp;
291+
cache[b_len] = temp;
287292
}
288-
cache[b.len()]
293+
cache[b_len]
289294
}
290295

291296
fn suggest_subcommand(unknown: &str) {
@@ -322,9 +327,10 @@ fn suggest_subcommand(unknown: &str) {
322327
"self",
323328
];
324329

330+
let mut cache = [0; 32];
325331
let mut matches = Vec::new();
326332
for cmd in SUBCOMMANDS {
327-
let dist = levenshtein(unknown, cmd);
333+
let dist = levenshtein(unknown, cmd, &mut cache);
328334
if dist <= 3 {
329335
matches.push(*cmd);
330336
}

0 commit comments

Comments
 (0)