mirror of
https://github.com/helix-editor/helix
synced 2024-11-10 10:34:45 +01:00
11f809c177
We will use this in the child commit to improve the picker's running indicator. Nucleo 0.4.0 includes an `active_injectors` member that we can use to detect if anything can push to the picker. When that count drops to zero we can remove the running indicator. Nucleo 0.4.1 contains a fix for crashes with interactive global search on a large directory.
50 lines
1.3 KiB
Rust
50 lines
1.3 KiB
Rust
use std::ops::DerefMut;
|
|
|
|
use nucleo::pattern::{Atom, AtomKind, CaseMatching, Normalization};
|
|
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, u16)> {
|
|
let mut matcher = MATCHER.lock();
|
|
matcher.config = Config::DEFAULT;
|
|
if path {
|
|
matcher.config.set_match_paths();
|
|
}
|
|
let pattern = Atom::new(
|
|
pattern,
|
|
CaseMatching::Smart,
|
|
Normalization::Smart,
|
|
AtomKind::Fuzzy,
|
|
false,
|
|
);
|
|
pattern.match_list(items, &mut matcher)
|
|
}
|