use std::ops::BitAnd;
use vortex_error::VortexResult;
use vortex_mask::Mask;
use vortex_scalar::Scalar;
use crate::arrays::{BoolArray, BoolVTable};
use crate::compute::{MinMaxKernel, MinMaxKernelAdapter, MinMaxResult};
use crate::register_kernel;
impl MinMaxKernel for BoolVTable {
fn min_max(&self, array: &BoolArray) -> VortexResult<Option<MinMaxResult>> {
let x = match array.validity_mask() {
Mask::AllTrue(_) => array.boolean_buffer().clone(),
Mask::AllFalse(_) => return Ok(None),
Mask::Values(v) => array.boolean_buffer().bitand(v.boolean_buffer()),
};
let mut slices = x.set_slices();
let Some(slice) = slices.next() else {
return Ok(Some(MinMaxResult {
min: Scalar::new(array.dtype().clone(), false.into()),
max: Scalar::new(array.dtype().clone(), false.into()),
}));
};
if slice.0 == 0 && slice.1 == x.len() {
return Ok(Some(MinMaxResult {
min: Scalar::new(array.dtype().clone(), true.into()),
max: Scalar::new(array.dtype().clone(), true.into()),
}));
};
Ok(Some(MinMaxResult {
min: Scalar::new(array.dtype().clone(), false.into()),
max: Scalar::new(array.dtype().clone(), true.into()),
}))
}
}
register_kernel!(MinMaxKernelAdapter(BoolVTable).lift());