use bisector::{Bisector, ConvergeTo, Indices, Step};
fn main() {
let values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let bisector = Bisector::new(&values);
let start_from = Indices::from_bisector(&bisector);
let step: Step<u32, u32> = bisector.bisect(|&value| ConvergeTo::Left(value), start_from);
assert_eq!(step.indices, Indices::new(0, 5));
assert_eq!(step.result.unwrap().try_into_left().unwrap(), 6);
let step: Step<u32, u32> = bisector.bisect(|&value| ConvergeTo::Right(value), step.indices);
assert_eq!(step.indices, Indices::new(3, 5));
assert_eq!(step.result.unwrap().try_into_right().unwrap(), 3);
let step: Step<u32, u32> = bisector.bisect(|&value| ConvergeTo::Left(value), step.indices);
assert_eq!(step.indices, Indices::new(3, 4));
assert_eq!(step.result.unwrap().try_into_left().unwrap(), 5);
let final_step: Step<u32, u32> =
bisector.bisect(|&value| ConvergeTo::Left(value), step.indices);
assert_eq!(final_step.indices, Indices::new(3, 3));
assert_eq!(final_step.result.unwrap().try_into_left().unwrap(), 4);
let step: Step<u32, u32> =
bisector.bisect(|&value| ConvergeTo::Left(value), final_step.indices);
assert_eq!(step.indices, Indices::new(3, 3));
assert!(step.result.is_none());
let step: Step<u32, u32> =
bisector.bisect(|&value| ConvergeTo::Right(value), final_step.indices);
assert_eq!(step.indices, Indices::new(3, 3));
assert!(step.result.is_none());
}