use crate::array::{
growable::{Growable, GrowableList},
ListArray, Offset, PrimitiveArray,
};
use super::Index;
pub fn take<I: Offset, O: Index>(
values: &ListArray<I>,
indices: &PrimitiveArray<O>,
) -> ListArray<I> {
let mut capacity = 0;
let arrays = indices
.values()
.iter()
.map(|index| {
let index = index.to_usize();
let slice = values.slice(index, 1);
capacity += slice.len();
slice
})
.collect::<Vec<ListArray<I>>>();
let arrays = arrays.iter().collect();
if let Some(validity) = indices.validity() {
let mut growable: GrowableList<I> = GrowableList::new(arrays, true, capacity);
for index in 0..indices.len() {
if validity.get_bit(index) {
growable.extend(index, 0, 1);
} else {
growable.extend_validity(1)
}
}
growable.into()
} else {
let mut growable: GrowableList<I> = GrowableList::new(arrays, false, capacity);
for index in 0..indices.len() {
growable.extend(index, 0, 1);
}
growable.into()
}
}