vortex_array/arrays/primitive/
accessor.rs1use std::iter;
2
3use vortex_dtype::NativePType;
4use vortex_error::VortexResult;
5
6use crate::accessor::ArrayAccessor;
7use crate::arrays::primitive::PrimitiveArray;
8use crate::validity::Validity;
9use crate::{Array, ToCanonical};
10
11impl<T: NativePType> ArrayAccessor<T> for PrimitiveArray {
12 fn with_iterator<F, R>(&self, f: F) -> VortexResult<R>
13 where
14 F: for<'a> FnOnce(&mut (dyn Iterator<Item = Option<&'a T>>)) -> R,
15 {
16 match self.validity() {
17 Validity::NonNullable | Validity::AllValid => {
18 let mut iter = self.as_slice::<T>().iter().map(Some);
19 Ok(f(&mut iter))
20 }
21 Validity::AllInvalid => Ok(f(&mut iter::repeat_n(None, self.len()))),
22 Validity::Array(v) => {
23 let validity = v.to_bool()?;
24 let mut iter = self
25 .as_slice::<T>()
26 .iter()
27 .zip(validity.boolean_buffer().iter())
28 .map(|(value, valid)| valid.then_some(value));
29 Ok(f(&mut iter))
30 }
31 }
32 }
33}