use std::cmp::Ordering;
pub fn binary_search<F: Fn(usize) -> Ordering>(start: usize, end: usize, cmp: F) -> Option<usize> {
if start >= end {
return None;
}
let half = (end - start) / 2;
let mid = start + half;
match cmp(mid) {
Ordering::Greater => binary_search(start, mid, cmp),
Ordering::Equal => Some(mid),
Ordering::Less => binary_search(mid + 1, end, cmp),
}
}
#[cfg(test)]
mod tests {
#[test]
fn test_binary_search() {
assert_eq!(super::binary_search(0, 8, |x| x.cmp(&6)), Some(6));
assert_eq!(super::binary_search(0, 5000, |x| x.cmp(&1337)), Some(1337));
assert_eq!(super::binary_search(0, 5000, |x| x.cmp(&9000)), None);
assert_eq!(super::binary_search(30, 50, |x| x.cmp(&42)), Some(42));
assert_eq!(super::binary_search(300, 500, |x| x.cmp(&42)), None);
assert_eq!(
super::binary_search(0, 500, |x| if x < 42 {
super::Ordering::Less
} else {
super::Ordering::Greater
}),
None
);
}
}