sidechain_block_search/
binary_search.rs1use std::cmp::Ordering;
2use std::ops::{Add, Div, Sub};
3
4pub 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}