pub struct SearchState {
pub query: SearchQuery,
pub matches: Vec<SearchMatch>,
pub active_index: Option<usize>,
/* private fields */
}Expand description
Mutable search results, selection, and cache state.
The cache key contains only the query and DocumentVersion. Callers must
change the version whenever the searched text changes or explicitly call
SearchState::invalidate_cache.
§Examples
use ailloli_ui_editor::{DocumentVersion, SearchQuery, SearchState};
let mut state = SearchState::new(SearchQuery::new("go"));
assert!(state.refresh("go stop go", DocumentVersion(1)));
assert_eq!(state.matches.len(), 2);
assert_eq!(state.active_index, Some(0));Fields§
§query: SearchQueryQuery used by the next refresh.
matches: Vec<SearchMatch>Ordered, non-overlapping matches from the last refresh.
active_index: Option<usize>Selected match index, or None when no match is selected.
Implementations§
Source§impl SearchState
Updates search results and active-match selection.
impl SearchState
Updates search results and active-match selection.
Sourcepub fn new(query: SearchQuery) -> Self
pub fn new(query: SearchQuery) -> Self
Creates an unrefreshed state for query.
§Examples
use ailloli_ui_editor::{SearchQuery, SearchState};
let state = SearchState::new(SearchQuery::new("needle"));
assert_eq!(state.query.text, "needle");
assert!(state.matches.is_empty() && state.active_index.is_none());Sourcepub fn set_query(&mut self, query: SearchQuery)
pub fn set_query(&mut self, query: SearchQuery)
Replaces the query and clears cached results when it differs.
Supplying an equal query is a no-op and preserves both matches and the active index.
§Examples
use ailloli_ui_editor::{DocumentVersion, SearchQuery, SearchState};
let mut state = SearchState::new(SearchQuery::new("old"));
state.refresh("old", DocumentVersion(1));
state.set_query(SearchQuery::new("new"));
assert!(state.matches.is_empty() && state.active_index.is_none());Sourcepub fn refresh(&mut self, text: &str, version: DocumentVersion) -> bool
pub fn refresh(&mut self, text: &str, version: DocumentVersion) -> bool
Recomputes results unless the query/version cache key is unchanged.
Returns true after recomputation and false for a cache hit. An
existing active index is clamped to the new final match; non-empty fresh
results otherwise select index zero.
§Examples
use ailloli_ui_editor::{DocumentVersion, SearchQuery, SearchState};
let mut state = SearchState::new(SearchQuery::new("a"));
assert!(state.refresh("a a", DocumentVersion(4)));
assert!(!state.refresh("different text", DocumentVersion(4)));
assert_eq!(state.matches.len(), 2);Sourcepub fn next_match(&mut self) -> Option<&SearchMatch>
pub fn next_match(&mut self) -> Option<&SearchMatch>
Selects and returns the following match, wrapping at the end.
Because a successful refresh selects index zero, the first call after a
multi-match refresh advances to index one. With no results, this returns
None and clears the active index.
§Examples
use ailloli_ui_editor::{DocumentVersion, SearchQuery, SearchState};
let mut state = SearchState::new(SearchQuery::new("x"));
state.refresh("x x", DocumentVersion(1));
assert_eq!(state.next_match().map(|m| m.range.clone()), Some(2..3));
assert_eq!(state.next_match().map(|m| m.range.clone()), Some(0..1));Sourcepub fn previous_match(&mut self) -> Option<&SearchMatch>
pub fn previous_match(&mut self) -> Option<&SearchMatch>
Selects and returns the preceding match, wrapping at the start.
With no results, this returns None and clears the active index.
§Examples
use ailloli_ui_editor::{DocumentVersion, SearchQuery, SearchState};
let mut state = SearchState::new(SearchQuery::new("x"));
state.refresh("x x", DocumentVersion(1));
assert_eq!(state.previous_match().map(|m| m.range.clone()), Some(2..3));Sourcepub fn set_active_index(&mut self, active_index: Option<usize>)
pub fn set_active_index(&mut self, active_index: Option<usize>)
Selects an in-range match index, otherwise clears the selection.
§Examples
use ailloli_ui_editor::{DocumentVersion, SearchQuery, SearchState};
let mut state = SearchState::new(SearchQuery::new("x"));
state.refresh("x x", DocumentVersion(1));
state.set_active_index(Some(9));
assert_eq!(state.active_index, None);
state.set_active_index(Some(1));
assert_eq!(state.active_index, Some(1));Sourcepub fn clear(&mut self)
pub fn clear(&mut self)
Restores the default empty query, results, selection, and cache.
§Examples
use ailloli_ui_editor::{DocumentVersion, SearchQuery, SearchState};
let mut state = SearchState::new(SearchQuery::new("x"));
state.refresh("x", DocumentVersion(1));
state.clear();
assert!(state.query.text.is_empty() && state.matches.is_empty());Sourcepub fn invalidate_cache(&mut self)
pub fn invalidate_cache(&mut self)
Forces the next SearchState::refresh to recompute.
Existing results and selection remain available until that refresh.
§Examples
use ailloli_ui_editor::{DocumentVersion, SearchQuery, SearchState};
let mut state = SearchState::new(SearchQuery::new("x"));
state.refresh("x", DocumentVersion(1));
state.invalidate_cache();
assert!(state.refresh("x x", DocumentVersion(1)));
assert_eq!(state.matches.len(), 2);Trait Implementations§
Source§impl Clone for SearchState
impl Clone for SearchState
Source§fn clone(&self) -> SearchState
fn clone(&self) -> SearchState
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for SearchState
impl Debug for SearchState
Source§impl Default for SearchState
Creates an empty search state with an empty query.
impl Default for SearchState
Creates an empty search state with an empty query.
Source§impl PartialEq for SearchState
impl PartialEq for SearchState
impl Eq for SearchState
impl StructuralPartialEq for SearchState
Auto Trait Implementations§
impl Freeze for SearchState
impl RefUnwindSafe for SearchState
impl Send for SearchState
impl Sync for SearchState
impl Unpin for SearchState
impl UnwindSafe for SearchState
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.