more_itertools/grouping/
split_before.rs1use crate::error::Error;
2use crate::others::cache_until::cache_until;
3
4pub fn split_before<T>(iter: Box<dyn Iterator<Item = Result<T,Error>>>,
5 pred: fn(&T) -> Result<bool, Error>,
6 maxsplit: i128
7) -> Box<dyn Iterator<Item = Result<Vec<T>, Error>>>
8where
9T: Clone + 'static
10{
11 cache_until(iter, pred, maxsplit, false)
12}
13
14#[cfg(test)]
15mod tests {
16
17 use crate::utils::generate_okok_iterator;
18
19 use super::*;
20
21 #[test]
22 fn test1() {
23 let v = vec![0,1,2,3,4,5,6,7,8,9];
24 let mut r = split_before(generate_okok_iterator(v), |x|{Ok(x%3==0)}, -1);
25 assert_eq!(Some(Ok(Vec::<i32>::new())), r.next());
26 assert_eq!(Some(Ok(vec![0,1,2])), r.next());
27 assert_eq!(Some(Ok(vec![3,4,5])), r.next());
28 assert_eq!(Some(Ok(vec![6,7,8])), r.next());
29 assert_eq!(Some(Ok(vec![9])), r.next());
30 assert_eq!(None, r.next());
31 assert_eq!(None, r.next());
32
33 let v = vec![0,1,2,3,4,5,6,7,8,9];
34 let mut r = split_before(generate_okok_iterator(v), |x|{Ok(x%3==0)}, 2);
35 assert_eq!(Some(Ok(Vec::<i32>::new())), r.next());
36 assert_eq!(Some(Ok(vec![0,1,2])), r.next());
37 assert_eq!(Some(Ok(vec![3,4,5,6,7,8,9])), r.next());
38 assert_eq!(None, r.next());
39 assert_eq!(None, r.next());
40
41 let v = vec![0,0,0];
42 let mut r = split_before(generate_okok_iterator(v), |x|{Ok(x%3==0)}, -1);
43 assert_eq!(Some(Ok(Vec::<i32>::new())), r.next());
44 assert_eq!(Some(Ok(vec![0])), r.next());
45 assert_eq!(Some(Ok(vec![0])), r.next());
46 assert_eq!(Some(Ok(vec![0])), r.next());
47 assert_eq!(None, r.next());
48 assert_eq!(None, r.next());
49
50 let v = vec![1,1,1];
51 let mut r = split_before(generate_okok_iterator(v), |x|{Ok(x%3==0)}, -1);
52 assert_eq!(Some(Ok(vec![1,1,1])), r.next());
53 assert_eq!(None, r.next());
54 assert_eq!(None, r.next());
55
56 let v = vec![1,1,1];
57 let mut r = split_before(generate_okok_iterator(v), |x|{Ok(x%3==0)}, 2);
58 assert_eq!(Some(Ok(vec![1,1,1])), r.next());
59 assert_eq!(None, r.next());
60 assert_eq!(None, r.next());
61 }
62}