mirror of https://github.com/helix-editor/helix
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
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)
|
|
}
|