more_itertools/grouping/
chunked_even.rs

1use crate::{error, sequence::Sequence};
2
3use super::divide::{divide, Divide};
4
5pub struct ChunkedEven<T> {
6    dist: Divide<T>,
7    cur: usize
8}
9
10pub fn chunked_even<T>(buf: Box<dyn Sequence<T>>, bucket_cnt: usize) -> ChunkedEven<T> 
11where
12T: Clone + 'static
13{
14    return ChunkedEven {
15        dist: divide(buf, bucket_cnt),
16        cur: 0
17    };
18}
19
20impl<T> Iterator for ChunkedEven<T>
21where
22T: Clone + 'static
23{
24    type Item = Result<Vec<T>, error::Error>;
25
26    fn next(&mut self) -> Option<Self::Item> {
27        if self.cur < self.dist.inner.n {
28            let mut cursor = self.dist.iter(self.cur);
29            self.cur += 1;
30
31            let mut ret = Vec::new();
32            loop {
33                let v = cursor.next();
34                match v {
35                    None => { break; }
36                    Some(v2) => {
37                        match v2 {
38                            Ok(v3) => { ret.push(v3); },
39                            Err(e) => { return Some(Err(e))}
40                        }
41                    }
42                }
43            }
44
45            return Some(Ok(ret));
46        } else {
47            return None;
48        }
49    }
50}
51
52#[cfg(test)]
53mod tests {
54    use crate::sequence::create_seq_from_vec;
55
56    use super::*;
57
58    #[test]
59    fn test1() {
60        let v = create_seq_from_vec(vec![1,2,3,4,5,6,7,8,9,10]);
61        let mut ce = chunked_even(v, 3);
62
63        assert_eq!(Some(Ok(vec![1, 2, 3, 4])), ce.next());
64        assert_eq!(Some(Ok(vec![5, 6, 7])), ce.next());
65        assert_eq!(Some(Ok(vec![8, 9, 10])), ce.next());
66        assert_eq!(None, ce.next());
67        assert_eq!(None, ce.next());
68        assert_eq!(None, ce.next());
69    }
70}