use core::cmp::Ordering;
extern crate alloc;
#[cfg(feature = "std")] use rayon::prelude::*;
use {
alloc::{borrow::ToOwned as _, string::ToString as _, vec::Vec},
regex::Regex,
};
pub fn bin_search<T: Ord>(arr: &[T], targ: &T) -> Option<usize> {
let (mut left, mut right) = (0, arr.len() - 1);
while left <= right {
let mid = (right + left) / 2;
match unsafe { arr.get_unchecked(mid).cmp(targ) } {
Ordering::Equal => return Some(mid),
Ordering::Greater => right = mid - 1,
Ordering::Less => left = mid + 1,
}
}
None
}
#[must_use]
pub fn mask_match(lower: usize, upper: usize, mask: &str) -> Vec<usize> {
assert!(lower <= upper, "lower bound can't be greater than upper bound");
let mut re = "^".to_owned();
re.push_str(&mask.replace('*', ".*").replace('?', ".?"));
re.push('$');
let re = Regex::new(&re).unwrap();
cfg_select! {
feature = "std" => (lower..=upper)
.into_par_iter()
.filter(|num| re.is_match(&num.to_string()))
.collect(),
_ => (lower..=upper).filter(|num| re.is_match(&num.to_string())).collect(),
}
}