pub struct SequenceWatchers<T>{ /* private fields */ }
Expand description
Monitors a stream of data for multiple sequences of data items.
§Examples
use seq_watcher::SequenceWatchers;
const CTRL_C: u8 = 3;
const CTRL_D: u8 = 4;
// Watch the input stream for two consecutive <CTRL-C> characters.
let watchers = SequenceWatchers::new(&[&[CTRL_C, CTRL_C], &[CTRL_C, CTRL_D]]);
for b in b'a'..=b'z' {
assert_eq!(false, watchers.check(&b)); // Send single ASCII byte
assert_eq!(false, watchers.check(&CTRL_C)); // Send single <Ctrl-C>
}
assert_eq!(true, watchers.check(&CTRL_C)); // Send a second <Ctrl-C>
assert_eq!(true, watchers.check(&CTRL_D)); // Send a <Ctrl-D>
Implementations§
Source§impl<T: Eq + Clone + Debug + Hash> SequenceWatchers<T>
impl<T: Eq + Clone + Debug + Hash> SequenceWatchers<T>
Sourcepub fn new(sequences: &[&[T]]) -> Self
pub fn new(sequences: &[&[T]]) -> Self
Create a new SequenceWatchers from a slice of slices of data. The data type can be anything with Eq, Debug, and Clone traits.
Internally, the SequenceWatchers structure contains a vector of SequenceWatcher structures.
§Examples
let watchers = SequenceWatchers::new(&[&['q'], &['Q']]);
assert_eq!(true, watchers.check(&'q'));
assert_eq!(true, watchers.check(&'Q'));
Sourcepub fn check(&self, value: &T) -> bool
pub fn check(&self, value: &T) -> bool
Tells the SequenceWatchers of a new input item and checks to see if a sequence has been completed. Returns true when a sequence is completed.
§Examples
let watchers = SequenceWatchers::new(&[&[false, true], &[false, true, true]]);
assert_eq!(false, watchers.check(&true));
assert_eq!(false, watchers.check(&false));
assert_eq!(true, watchers.check(&true)); // Matches first sequence
assert_eq!(true, watchers.check(&true)); // Matches second sequence
Sourcepub fn add(&mut self, new_seq: &[T])
pub fn add(&mut self, new_seq: &[T])
Adds a new SequenceWatcher to the SequenceWatchers. If the sequence matches a pre-existing SequenceWatcher, it does nothing.
§Examples
let mut watchers = SequenceWatchers::new(&[]);
watchers.add(&[]); // This does nothing.
watchers.add(&[false, true]);
watchers.add(&[false, true, true]);
assert_eq!(false, watchers.check(&true));
assert_eq!(false, watchers.check(&false));
assert_eq!(true, watchers.check(&true)); // Matches first sequence
assert_eq!(true, watchers.check(&true)); // Matches second sequence
Sourcepub fn remove(&mut self, seq: &[T]) -> Option<SequenceWatcher<T>>
pub fn remove(&mut self, seq: &[T]) -> Option<SequenceWatcher<T>>
Removes a sequence watcher for a given sequence. It returns the removed SequenceWatcher.
§Examples
let mut watchers = SequenceWatchers::new(&[&[false, true], &[false, true, true]]);
watchers.remove(&[false, true, true]);
assert_eq!(false, watchers.check(&true));
assert_eq!(false, watchers.check(&false));
assert_eq!(true, watchers.check(&true)); // Matches first sequence
assert_eq!(false, watchers.check(&true)); // Matches second sequence, which was removed
Sourcepub fn len(&self) -> usize
pub fn len(&self) -> usize
Returns the number of sequences being monitored.
§Examples
let watchers = SequenceWatchers::new(&[&['A'], &['B'], &['C'], &['D']]);
assert_eq!(4, watchers.len());
Sourcepub fn sequences(&self) -> Keys<'_, Vec<T>, SequenceWatcher<T>>
pub fn sequences(&self) -> Keys<'_, Vec<T>, SequenceWatcher<T>>
Returns an iterator over the sequences being monitored by the SequenceWatchers.
§Examples
let watchers = SequenceWatchers::new(&[&[false, true], &[false, true, true]]);
let mut sequences: Vec<&Vec<bool>> = watchers.sequences().collect();
sequences.sort(); // Make sure keys are sorted.
let mut sequences = sequences.into_iter();
assert_eq!(sequences.next(), Some(&vec![false, true]));
assert_eq!(sequences.next(), Some(&vec![false, true, true]));
assert_eq!(sequences.next(), None);