Skip to main content

lumen_dataset/base/
dataset.rs

1use std::fmt::Display;
2
3pub trait Dataset {
4    type Item;
5    type Error: Display;
6
7    /// Gets the item at the given index.
8    fn get(&self, index: usize) -> Result<Option<Self::Item>, Self::Error>;
9
10    /// Gets the number of items in the dataset.
11    fn len(&self) -> usize;
12
13    /// Checks if the dataset is empty.
14    fn is_empty(&self) -> bool {
15        self.len() == 0
16    }
17
18    /// Returns an iterator over the dataset.
19    fn iter(&self) -> DatasetIterator<'_, Self>
20    where
21        Self: Sized,
22    {
23        DatasetIterator::new(self)
24    }
25}
26
27//===========================================================//
28//                Iter
29//===========================================================//
30
31pub struct DatasetIterator<'a, D: Dataset> {
32    index: usize,
33    dataset: &'a D,
34}
35
36impl<'a, D: Dataset> DatasetIterator<'a, D> {
37    /// Creates a new dataset iterator.
38    pub fn new(dataset: &'a D) -> Self {
39        DatasetIterator {
40            index: 0,
41            dataset,
42        }
43    }
44}
45
46impl<D: Dataset> Iterator for DatasetIterator<'_, D> {
47    type Item = Result<D::Item, D::Error>;
48
49    fn next(&mut self) -> Option<Self::Item> {
50        match self.dataset.get(self.index) {
51            Ok(Some(item)) => {
52                self.index += 1;
53                Some(Ok(item)) 
54            }
55            Ok(None) => None, 
56            Err(e) => {
57                self.index += 1; 
58                Some(Err(e))
59            }
60        }
61    }
62}