sidechain_block_search/
binary_search.rs

1use std::cmp::Ordering;
2use std::ops::{Add, Div, Sub};
3
4/// Performs binary search over `range` using ordering provided by `f`
5pub fn binary_search_by<T, F, E>(range: std::ops::Range<T>, mut f: F) -> Option<T>
6where
7	F: FnMut(&T) -> Result<Ordering, E>,
8	T: Add<Output = T> + Div<Output = T> + Sub<Output = T> + PartialOrd,
9	T: From<u8>,
10	T: Copy,
11{
12	let (mut left, mut right) = (range.start, range.end);
13
14	while left <= right {
15		let middle = (left + right) / 2.into();
16
17		match f(&middle).ok()? {
18			Ordering::Equal => return Some(middle),
19			Ordering::Less => left = middle + 1.into(),
20			Ordering::Greater => right = middle - 1.into(),
21		}
22	}
23
24	None
25}