use arrow_array::ArrayRef;
use arrow_schema::{ArrowError, FieldRef};
pub trait ArrayReader: Iterator<Item = Result<ArrayRef, ArrowError>> {
fn field(&self) -> FieldRef;
}
impl<R: ArrayReader + ?Sized> ArrayReader for Box<R> {
fn field(&self) -> FieldRef {
self.as_ref().field()
}
}
pub struct ArrayIterator<I>
where
I: IntoIterator<Item = Result<ArrayRef, ArrowError>>,
{
inner: I::IntoIter,
inner_field: FieldRef,
}
impl<I> ArrayIterator<I>
where
I: IntoIterator<Item = Result<ArrayRef, ArrowError>>,
{
pub fn new(iter: I, field: FieldRef) -> Self {
Self {
inner: iter.into_iter(),
inner_field: field,
}
}
}
impl<I> Iterator for ArrayIterator<I>
where
I: IntoIterator<Item = Result<ArrayRef, ArrowError>>,
{
type Item = I::Item;
fn next(&mut self) -> Option<Self::Item> {
self.inner.next()
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner.size_hint()
}
}
impl<I> ArrayReader for ArrayIterator<I>
where
I: IntoIterator<Item = Result<ArrayRef, ArrowError>>,
{
fn field(&self) -> FieldRef {
self.inner_field.clone()
}
}