1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
use itertools::Itertools;

///Splits a mutable slice into multiple slices
///The splits occur where the predicate returns false.
pub struct SliceSplitMut<'a,T,F>{
    arr:Option<&'a mut [T]>,
    func:F
}

impl<'a,T,F:FnMut(&T,&T)->bool> SliceSplitMut<'a,T,F>
{
    pub fn new(arr:&'a mut [T],func:F)->SliceSplitMut<'a,T,F>
    {
        SliceSplitMut{arr:Some(arr),func}
    }
}

impl<'a,T,F:FnMut(&T,&T)->bool> Iterator for SliceSplitMut<'a,T,F>{
    type Item=&'a mut [T];
    fn next(&mut self)->Option<Self::Item>{
        let (last,arr)={
            let arr=self.arr.take()?;
            let i=arr.get(0)?;        
            let count=arr.iter().peeking_take_while(|a|(self.func)(a,i)).count();
            (count,arr)
        };
        let (first,rest)=arr.split_at_mut(last);
        self.arr=Some(rest);
        Some(first)
    }
}

///Splits a mutable slice into multiple slices
///The splits occur where the predicate returns false.
pub struct SliceSplit<'a,T,F>{
    arr:Option<&'a [T]>,
    func:F
}
impl<'a,T,F:FnMut(&T,&T)->bool> SliceSplit<'a,T,F>{
    pub fn new(arr:&'a [T],func:F)->SliceSplit<'a,T,F>{
        SliceSplit{arr:Some(arr),func}
    }
}
impl<'a,T,F:FnMut(&T,&T)->bool> Iterator for SliceSplit<'a,T,F>{
    type Item=&'a [T];
    fn next(&mut self)->Option<Self::Item>{
        let (last,arr)={
            let arr=self.arr.take()?;
            let i=arr.get(0)?;        
            let count=arr.iter().peeking_take_while(|a|(self.func)(a,i)).count();
            (count,arr)
        };
        let (first,rest)=arr.split_at(last);
        self.arr=Some(rest);
        Some(first)
    }
}