lumen_dataset/base/
dataset.rs1use std::fmt::Display;
2
3pub trait Dataset {
4 type Item;
5 type Error: Display;
6
7 fn get(&self, index: usize) -> Result<Option<Self::Item>, Self::Error>;
9
10 fn len(&self) -> usize;
12
13 fn is_empty(&self) -> bool {
15 self.len() == 0
16 }
17
18 fn iter(&self) -> DatasetIterator<'_, Self>
20 where
21 Self: Sized,
22 {
23 DatasetIterator::new(self)
24 }
25}
26
27pub struct DatasetIterator<'a, D: Dataset> {
32 index: usize,
33 dataset: &'a D,
34}
35
36impl<'a, D: Dataset> DatasetIterator<'a, D> {
37 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}