Function slice_group_by::exponential_search_by
source · pub fn exponential_search_by<T, F>(slice: &[T], f: F) -> Result<usize, usize>where
F: FnMut(&T) -> Ordering,
Expand description
Binary searches this sorted slice with a comparator function.
The comparator function should implement an order consistent with the sort order of
the underlying slice, returning an order code that indicates whether its argument
is Less
, Equal
or Greater
the desired target.
If the value is found then Ok
is returned, containing the index of the matching element;
if the value is not found then Err
is returned, containing the index where a matching element
could be inserted while maintaining sorted order.
Examples
Looks up a series of four elements. The first is found, with a
uniquely determined position; the second and third are not
found; the fourth could match any position in [1, 4]
.
use slice_group_by::exponential_search_by;
let s = &[0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
let seek = 13;
assert_eq!(exponential_search_by(s, |probe| probe.cmp(&seek)), Ok(9));
let seek = 4;
assert_eq!(exponential_search_by(s, |probe| probe.cmp(&seek)), Err(7));
let seek = 100;
assert_eq!(exponential_search_by(s, |probe| probe.cmp(&seek)), Err(13));
let seek = 1;
let r = exponential_search_by(s, |probe| probe.cmp(&seek));
assert!(match r { Ok(1..=4) => true, _ => false, });