vortex_array/arrays/primitive/
accessor.rs

1use 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}