use std::ops::Range;
use vortex_array::ArrayRef;
use vortex_array::ArrayView;
use vortex_array::ExecutionCtx;
use vortex_array::IntoArray;
use vortex_array::arrays::slice::SliceKernel;
use vortex_error::VortexResult;
use crate::ConstantArray;
use crate::Sparse;
impl SliceKernel for Sparse {
fn slice(
array: ArrayView<'_, Self>,
range: Range<usize>,
_ctx: &mut ExecutionCtx,
) -> VortexResult<Option<ArrayRef>> {
let Some(new_patches) = array.patches().slice(range.clone())? else {
return Ok(Some(
ConstantArray::new(array.fill_scalar().clone(), range.len()).into_array(),
));
};
if new_patches.array_len() == new_patches.values().len() {
return Ok(Some(new_patches.into_values()));
}
Ok(Some(
unsafe { Sparse::new_unchecked(new_patches, array.fill_scalar().clone()) }.into_array(),
))
}
}