1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//! Yield index from zero to `data_source_len` in ascending order.

use crate::{sampler::Sampler, Len};
use std::ops::Range;

/// Yield index from zero to `data_source_len` in ascending order.
#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Hash, Eq, Ord)]
pub struct SequentialSampler {
    /// The length of the dataset that will be sampled.
    pub data_source_len: usize,
}
impl Sampler for SequentialSampler {
    fn new(data_source_len: usize) -> Self {
        Self { data_source_len }
    }
}

impl Len for SequentialSampler {
    fn len(&self) -> usize {
        self.data_source_len
    }
}
impl IntoIterator for SequentialSampler {
    type IntoIter = Range<usize>;
    type Item = usize;
    fn into_iter(self) -> Self::IntoIter {
        0..self.data_source_len
    }
}

#[test]
fn sequential_sampler() {
    let dataset = vec![1, 2, 3];
    let sampler = SequentialSampler {
        data_source_len: dataset.len(),
    };
    let mut iter = sampler.into_iter();
    assert_eq!(iter.next(), Some(0));
    assert_eq!(iter.next(), Some(1));
    assert_eq!(iter.next(), Some(2));
    assert_eq!(iter.next(), None);
}