From 0103cf526e70efc2140ae4e898655ac8309b50cc Mon Sep 17 00:00:00 2001 From: Michael Davis Date: Sat, 21 Jun 2025 13:40:47 -0400 Subject: [PATCH] Use KString as the small-string type for the WordIndex It's already used in gix and tree-house so it does not introduce a new dependency. It's a small-string type that fits into 16B (like a `Box`) meant to be primarily used as keys for large maps. --- helix-view/src/handlers/word_index.rs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/helix-view/src/handlers/word_index.rs b/helix-view/src/handlers/word_index.rs index dfb2adba3..9c3f83384 100644 --- a/helix-view/src/handlers/word_index.rs +++ b/helix-view/src/handlers/word_index.rs @@ -127,8 +127,7 @@ const MIN_WORD_GRAPHEMES: usize = 3; /// Maximum word length allowed (in chars) const MAX_WORD_LEN: usize = 50; -// TODO: choose or create a suitable small string type. -type Word = String; +type Word = kstring::KString; #[derive(Debug, Default)] struct WordIndexInner { @@ -150,7 +149,11 @@ impl WordIndexInner { if let Some(rc) = self.words.get_mut(word.as_ref()) { *rc = rc.saturating_add(1); } else { - self.words.insert(word.into_owned(), 1); + let word = match word { + Cow::Owned(s) => Word::from_string(s), + Cow::Borrowed(s) => Word::from_ref(s), + }; + self.words.insert(word, 1); } } @@ -180,7 +183,10 @@ impl WordIndex { let inner = self.inner.read(); let mut matches = fuzzy_match(pattern, inner.words(), false); matches.sort_unstable_by_key(|(_, score)| *score); - matches.into_iter().map(|(word, _)| word.clone()).collect() + matches + .into_iter() + .map(|(word, _)| word.to_string()) + .collect() } fn add_document(&self, text: &Rope) { @@ -437,7 +443,7 @@ mod tests { impl WordIndex { fn words(&self) -> HashSet { let inner = self.inner.read(); - inner.words().cloned().collect() + inner.words().map(|w| w.to_string()).collect() } }