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;
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)
}
}
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)
}
}