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