use vortex_dtype::DType;
use vortex_error::VortexResult;
use crate::arrays::{ListViewArray, ListViewVTable};
use crate::compute::{self, CastKernel, CastKernelAdapter};
use crate::vtable::ValidityHelper;
use crate::{ArrayRef, register_kernel};
impl CastKernel for ListViewVTable {
fn cast(&self, array: &ListViewArray, dtype: &DType) -> VortexResult<Option<ArrayRef>> {
let Some(target_element_type) = dtype.as_list_element_opt() else {
return Ok(None);
};
let new_elements = compute::cast(array.elements(), target_element_type)?;
let validity = array
.validity()
.clone()
.cast_nullability(dtype.nullability(), array.len())?;
Ok(Some(
unsafe {
ListViewArray::new_unchecked(
new_elements,
array.offsets().clone(),
array.sizes().clone(),
validity,
)
}
.to_array(),
))
}
}
register_kernel!(CastKernelAdapter(ListViewVTable).lift());