diff --git a/src/conversion/chewing.rs b/src/conversion/chewing.rs index 92c05fb4..d45e2bef 100644 --- a/src/conversion/chewing.rs +++ b/src/conversion/chewing.rs @@ -37,20 +37,25 @@ impl ChewingEngine { .fold(vec![], |acc, interval| glue_fn(comp, acc, interval)) }; let fast_dp_clone = fast_dp.clone(); + let mut cached_paths = None; let slow_search = iter::once_with(move || { if comp.is_empty() { return vec![]; } - let intervals = self.find_intervals(dict, comp); - let paths = self.find_k_paths(Self::MAX_OUT_PATHS, comp.len(), intervals); - trace!("paths: {:#?}", paths); - debug_assert!(!paths.is_empty()); - - let mut trimmed_paths = self.trim_paths(paths); - debug_assert!(!trimmed_paths.is_empty()); - - trimmed_paths.sort_by(|a, b| b.cmp(a)); - trimmed_paths + cached_paths + .get_or_insert_with(|| { + let intervals = self.find_intervals(dict, comp); + let paths = self.find_k_paths(Self::MAX_OUT_PATHS, comp.len(), intervals); + trace!("paths: {:#?}", paths); + debug_assert!(!paths.is_empty()); + + let mut trimmed_paths = self.trim_paths(paths); + debug_assert!(!trimmed_paths.is_empty()); + + trimmed_paths.sort_by(|a, b| b.cmp(a)); + trimmed_paths + }) + .to_vec() }) .flatten() .map(|p| { diff --git a/src/editor/mod.rs b/src/editor/mod.rs index 3ae98520..8a2984cd 100644 --- a/src/editor/mod.rs +++ b/src/editor/mod.rs @@ -506,11 +506,15 @@ impl SharedState { self.nth_conversion = 0; } fn conversion(&self) -> Vec { - self.conv - .convert(&self.dict, self.com.as_ref()) - .cycle() - .nth(self.nth_conversion) - .unwrap() + if self.nth_conversion > 0 { + let paths: Vec<_> = self.conv.convert(&self.dict, self.com.as_ref()).collect(); + paths[self.nth_conversion % paths.len()].clone() + } else { + self.conv + .convert(&self.dict, self.com.as_ref()) + .next() + .unwrap() + } } fn intervals(&self) -> impl Iterator { self.conversion().into_iter()