pub trait Array: Clone {
type Item;
fn len(&self) -> usize;
fn is_empty(&self) -> bool {
self.len() == 0
}
fn get(&self, index: usize) -> Option<Self::Item>;
}
#[derive(Clone)]
pub struct Iter<'a, T: Array> {
array: T,
len: usize,
pos: usize,
_phantom: core::marker::PhantomData<&'a ()>,
}
impl<'a, T: Array> Iter<'a, T> {
pub(crate) fn new(array: T, len: usize) -> Self {
Self {
array,
len,
pos: 0,
_phantom: core::marker::PhantomData,
}
}
}
impl<'a, T: Array> Iterator for Iter<'a, T> {
type Item = T::Item;
fn next(&mut self) -> Option<Self::Item> {
if self.pos >= self.len {
return None;
}
let pos = self.pos;
self.pos = pos + 1;
self.array.get(pos)
}
}