pub trait BacktrackingIterator: Iterator {
type RefPoint;
fn get_ref_point(&self) -> Self::RefPoint;
fn get_oldest_point(&self) -> Self::RefPoint;
fn backtrack(&mut self, point: Self::RefPoint);
fn forget_before(&mut self, point: Self::RefPoint);
fn start_again(&mut self) { ... }
fn forget(&mut self) { ... }
}Expand description
A trait for defining backtracking behaviour over This serves to generify the copying and non-copying verions and their behaviour
Required Associated Types
Required Methods
sourcefn get_ref_point(&self) -> Self::RefPoint
fn get_ref_point(&self) -> Self::RefPoint
Yield a reference to the current point in the history This reference must be valid for as long as the current point remains in the history
sourcefn get_oldest_point(&self) -> Self::RefPoint
fn get_oldest_point(&self) -> Self::RefPoint
Yield a reference to the oldest point in the history
sourcefn backtrack(&mut self, point: Self::RefPoint)
fn backtrack(&mut self, point: Self::RefPoint)
Return to a given point in the history Doesn’t have to do anything if the point is invalid
extern crate backtracking_iterator;
use backtracking_iterator::{BacktrackingIterator, Walkback, Walkbackable};
let v = vec![1_u8, 2_u8, 3_u8];
let mut rec = backtracking_iterator::BacktrackingRecorder::new(v.into_iter());
let mut bt = rec.copying();
bt.next(); // 1_u8
bt.next(); // 2_u8
let wb_pos = {
let mut wb = bt.walk_back();
assert!(wb.next().unwrap() == 2_u8);
wb.get_ref_point()
};
bt.backtrack(wb_pos);
assert!(bt.next().unwrap() == 2_u8);sourcefn forget_before(&mut self, point: Self::RefPoint)
fn forget_before(&mut self, point: Self::RefPoint)
Eliminate all the values before the given reference point from the history
Provided Methods
sourcefn start_again(&mut self)
fn start_again(&mut self)
Start the iterator again from all the elements in the current history
The iterator will repeat every element which was emitted since the last
call to forget().
extern crate backtracking_iterator;
use backtracking_iterator::BacktrackingIterator;
let v = vec![1_u8, 2_u8];
let mut rec = backtracking_iterator::BacktrackingRecorder::new(v.into_iter());
let mut bt = rec.copying();
bt.next();
bt.start_again();
assert!(bt.next().unwrap() == 1_u8);sourcefn forget(&mut self)
fn forget(&mut self)
Forget all the values before the current position in the iterator
extern crate backtracking_iterator;
use backtracking_iterator::BacktrackingIterator;
let v = vec![1_u8, 2_u8];
let mut rec = backtracking_iterator::BacktrackingRecorder::new(v.into_iter());
let mut bt = rec.copying();
bt.next();
//Before we call this, 1_u8 is in the history
bt.forget();
bt.start_again();
assert!(bt.next().unwrap() == 2_u8);