more_itertools/grouping/
sliced.rs

1use crate::error;
2use crate::error::Error;
3use crate::sequence::Sequence;
4
5pub struct Sliced<T> {
6    buf: Box<dyn Sequence<T>>,
7    n: usize, 
8    strict: bool,
9    cur: usize
10}
11
12impl<T> Iterator for Sliced<T> 
13where
14T: Clone
15{
16    type Item = Result<Vec<T>, Error>;
17
18    fn next(&mut self) -> Option<Self::Item> {
19
20        if self.cur >= self.buf.len() {
21            return None;
22        }
23
24        let mut end = self.cur + self.n;
25
26        if end > self.buf.len() {
27            end = self.buf.len();
28        }
29
30        let mut ret = Vec::new();
31
32        for i in self.cur..end {
33            ret.push(self.buf.get(i).unwrap().clone());
34        }
35
36        self.cur += self.n;
37
38        if self.strict && ret.len() < self.n {
39            return Some(Err(error::value_error("vector.len is not divisible by n.".to_string())));
40        }
41
42        return Some(Ok(ret));
43    }
44}
45
46pub fn sliced<T>(seq: Box<dyn Sequence<T>>, n: usize, strict: bool) -> Box<dyn Iterator<Item = Result<Vec<T>, Error>>>
47where
48T: Clone + 'static
49{
50    return Box::new(Sliced {
51        buf: seq,
52        n,
53        strict,
54        cur: 0
55    });
56}
57
58#[cfg(test)]
59mod tests {
60    use crate::sequence::create_seq_from_vec;
61
62    use super::*;
63
64    #[test]
65    fn test1() {
66        let mut it = sliced(create_seq_from_vec(vec![1,2,3,4,5,6,7,8,9,10]), 3, false);
67        assert_eq!(vec![1,2,3], it.next().unwrap().ok().unwrap());
68        assert_eq!(vec![4,5,6], it.next().unwrap().ok().unwrap());
69        assert_eq!(vec![7,8,9], it.next().unwrap().ok().unwrap());
70        assert_eq!(vec![10], it.next().unwrap().ok().unwrap());
71        assert_eq!(None, it.next());
72    }
73
74    #[test]
75    fn test2() {
76        let mut it = sliced(create_seq_from_vec(vec![1,2,3,4,5,6,7,8,9,10,11]), 3, true);
77        assert_eq!(vec![1,2,3], it.next().unwrap().ok().unwrap());
78        assert_eq!(vec![4,5,6], it.next().unwrap().ok().unwrap());
79        assert_eq!(vec![7,8,9], it.next().unwrap().ok().unwrap());
80        match it.next().unwrap() {
81            Ok(_) => { assert!(false); },
82            Err(_) => { assert!(true); }
83        }
84    }
85}