more_itertools/grouping/
split_before.rs

1use 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}