diff --git a/core/src/manager/finder.rs b/core/src/manager/finder.rs index 414de6b2..acd420f4 100644 --- a/core/src/manager/finder.rs +++ b/core/src/manager/finder.rs @@ -7,7 +7,7 @@ use shared::Url; use crate::files::Files; pub struct Finder { - query: Regex, + query: Regex, matched: BTreeMap, version: u64, } @@ -19,20 +19,21 @@ impl Finder { pub(super) fn arrow(&self, files: &Files, cursor: usize, prev: bool) -> Option { if prev { - files - .iter() - .take(cursor) - .rev() - .enumerate() - .find(|(_, f)| f.name().map_or(false, |n| self.matches(n))) - .map(|(i, _)| -(i as isize) - 1) + for i in 1..files.len() { + let index = (cursor + files.len() - i) % files.len(); + if files[index].name().is_some_and(|name| self.matches(name)) { + return Some((index as isize) - (cursor as isize)); + } + } + None } else { - files - .iter() - .skip(cursor + 1) - .enumerate() - .find(|(_, f)| f.name().map_or(false, |n| self.matches(n))) - .map(|(i, _)| i as isize + 1) + for i in 1..files.len() { + let index = (cursor + i) % files.len(); + if files[index].name().is_some_and(|name| self.matches(name)) { + return Some((index as isize) - (cursor as isize)); + } + } + None } } @@ -123,10 +124,14 @@ impl Finder { impl Finder { #[inline] - pub fn matched(&self) -> &BTreeMap { &self.matched } + pub fn matched(&self) -> &BTreeMap { + &self.matched + } #[inline] - pub fn has_matched(&self) -> bool { !self.matched.is_empty() } + pub fn has_matched(&self) -> bool { + !self.matched.is_empty() + } #[inline] pub fn matched_idx(&self, url: &Url) -> Option {