use vortex_dtype::match_each_native_ptype;
use vortex_error::VortexResult;
use vortex_scalar::Scalar;
use crate::array::primitive::PrimitiveArray;
use crate::compute::{SearchResult, SearchSorted, SearchSortedFn, SearchSortedSide};
impl SearchSortedFn for PrimitiveArray {
fn search_sorted(&self, value: &Scalar, side: SearchSortedSide) -> VortexResult<SearchResult> {
match_each_native_ptype!(self.ptype(), |$T| {
let pvalue: $T = value.try_into()?;
Ok(self.maybe_null_slice::<$T>().search_sorted(&pvalue, side))
})
}
}
#[cfg(test)]
mod test {
use super::*;
use crate::compute::search_sorted;
use crate::IntoArray;
#[test]
fn test_searchsorted_primitive() {
let values = vec![1u16, 2, 3].into_array();
assert_eq!(
search_sorted(&values, 0, SearchSortedSide::Left).unwrap(),
SearchResult::NotFound(0)
);
assert_eq!(
search_sorted(&values, 1, SearchSortedSide::Left).unwrap(),
SearchResult::Found(0)
);
assert_eq!(
search_sorted(&values, 1, SearchSortedSide::Right).unwrap(),
SearchResult::Found(1)
);
assert_eq!(
search_sorted(&values, 4, SearchSortedSide::Left).unwrap(),
SearchResult::NotFound(3)
);
}
}