more_itertools/grouping/
split_after.rs

1use crate::{error::Error, others::cache_until::cache_until};
2
3pub fn splite_after<T>(iter: Box<dyn Iterator<Item = Result<T,Error>>>, 
4    pred: fn(&T) -> Result<bool,Error>,
5    maxsplit: i128
6) -> Box<dyn Iterator<Item = Result<Vec<T>, Error>>>
7where 
8T: Clone + 'static
9{
10    cache_until(iter, pred, maxsplit, true)
11}
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 = splite_after(generate_okok_iterator(v), |x|{Ok(x%3==0)}, -1);
25        assert_eq!(Some(Ok(vec![0])), r.next());
26        assert_eq!(Some(Ok(vec![1,2,3])), r.next());
27        assert_eq!(Some(Ok(vec![4,5,6])), r.next());
28        assert_eq!(Some(Ok(vec![7,8,9])), r.next());
29        assert_eq!(Some(Ok(Vec::<i32>::new())), 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 = splite_after(generate_okok_iterator(v), |x|{Ok(x%3==0)}, 2);
35        assert_eq!(Some(Ok(vec![0])), r.next());
36        assert_eq!(Some(Ok(vec![1,2,3])), r.next());
37        assert_eq!(Some(Ok(vec![4,5,6,7,8,9])), r.next());
38
39        let v = vec![0,1,2,3,4,5,6,7,8,9];
40        let mut r = splite_after(generate_okok_iterator(v), |x|{Ok(x%3==0)}, 0);
41        assert_eq!(Some(Ok(vec![0,1,2,3,4,5,6,7,8,9])), r.next());
42        assert_eq!(None, r.next());
43    }
44}