use std::fmt::Display;
pub trait Dataset {
type Item;
type Error: Display;
fn get(&self, index: usize) -> Result<Option<Self::Item>, Self::Error>;
fn len(&self) -> usize;
fn is_empty(&self) -> bool {
self.len() == 0
}
fn iter(&self) -> DatasetIterator<'_, Self>
where
Self: Sized,
{
DatasetIterator::new(self)
}
}
pub struct DatasetIterator<'a, D: Dataset> {
index: usize,
dataset: &'a D,
}
impl<'a, D: Dataset> DatasetIterator<'a, D> {
pub fn new(dataset: &'a D) -> Self {
DatasetIterator {
index: 0,
dataset,
}
}
}
impl<D: Dataset> Iterator for DatasetIterator<'_, D> {
type Item = Result<D::Item, D::Error>;
fn next(&mut self) -> Option<Self::Item> {
match self.dataset.get(self.index) {
Ok(Some(item)) => {
self.index += 1;
Some(Ok(item))
}
Ok(None) => None,
Err(e) => {
self.index += 1;
Some(Err(e))
}
}
}
}