use std::ops::Range;
use itertools::Itertools;
use vortex_scalar::Scalar;
use crate::arrays::struct_::{StructArray, StructVTable};
use crate::vtable::{OperationsVTable, ValidityHelper};
use crate::{ArrayRef, IntoArray};
impl OperationsVTable<StructVTable> for StructVTable {
fn slice(array: &StructArray, range: Range<usize>) -> ArrayRef {
let fields = array
.fields()
.iter()
.map(|field| field.slice(range.clone()))
.collect_vec();
unsafe {
StructArray::new_unchecked(
fields,
array.struct_fields().clone(),
range.len(),
array.validity().slice(range),
)
}
.into_array()
}
fn scalar_at(array: &StructArray, index: usize) -> Scalar {
Scalar::struct_(
array.dtype().clone(),
array
.fields()
.iter()
.map(|field| field.scalar_at(index))
.collect_vec(),
)
}
}