diff options
Diffstat (limited to 'helix-core/src')
-rw-r--r-- | helix-core/src/fuzzy.rs | 43 | ||||
-rw-r--r-- | helix-core/src/lib.rs | 1 |
2 files changed, 44 insertions, 0 deletions
diff --git a/helix-core/src/fuzzy.rs b/helix-core/src/fuzzy.rs new file mode 100644 index 00000000..e40a2d06 --- /dev/null +++ b/helix-core/src/fuzzy.rs @@ -0,0 +1,43 @@ +use std::ops::DerefMut; + +use nucleo::pattern::{AtomKind, CaseMatching, Pattern}; +use nucleo::Config; +use parking_lot::Mutex; + +pub struct LazyMutex<T> { + inner: Mutex<Option<T>>, + init: fn() -> T, +} + +impl<T> LazyMutex<T> { + pub const fn new(init: fn() -> T) -> Self { + Self { + inner: Mutex::new(None), + init, + } + } + + pub fn lock(&self) -> impl DerefMut<Target = T> + '_ { + parking_lot::MutexGuard::map(self.inner.lock(), |val| val.get_or_insert_with(self.init)) + } +} + +pub static MATCHER: LazyMutex<nucleo::Matcher> = LazyMutex::new(nucleo::Matcher::default); + +/// convenience function to easily fuzzy match +/// on a (relatively small list of inputs). This is not recommended for building a full tui +/// application that can match large numbers of matches as all matching is done on the current +/// thread, effectively blocking the UI +pub fn fuzzy_match<T: AsRef<str>>( + pattern: &str, + items: impl IntoIterator<Item = T>, + path: bool, +) -> Vec<(T, u32)> { + let mut matcher = MATCHER.lock(); + matcher.config = Config::DEFAULT; + if path { + matcher.config.set_match_paths(); + } + let pattern = Pattern::new(pattern, CaseMatching::Smart, AtomKind::Fuzzy); + pattern.match_list(items, &mut matcher) +} diff --git a/helix-core/src/lib.rs b/helix-core/src/lib.rs index 9a512eae..0acdb238 100644 --- a/helix-core/src/lib.rs +++ b/helix-core/src/lib.rs @@ -7,6 +7,7 @@ pub mod config; pub mod diagnostic; pub mod diff; pub mod doc_formatter; +pub mod fuzzy; pub mod graphemes; pub mod history; pub mod increment; |