more_itertools/grouping/
chunked_even.rs1use 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}