@@ -2,6 +2,15 @@ use crate::iter::plumbing::*;
2
2
use crate :: iter:: * ;
3
3
use std:: fmt;
4
4
5
+ fn find_first_index < T , P > ( xs : & [ T ] , pred : & P ) -> Option < usize >
6
+ where
7
+ P : Fn ( & T , & T ) -> bool ,
8
+ {
9
+ xs. windows ( 2 )
10
+ . position ( |w| !pred ( & w[ 0 ] , & w[ 1 ] ) )
11
+ . map ( |i| i + 1 )
12
+ }
13
+
5
14
fn find_index < T , P > ( xs : & [ T ] , pred : & P ) -> Option < usize >
6
15
where
7
16
P : Fn ( & T , & T ) -> bool ,
@@ -52,11 +61,23 @@ where
52
61
}
53
62
}
54
63
55
- fn fold_with < F > ( self , folder : F ) -> F
64
+ fn fold_with < F > ( mut self , folder : F ) -> F
56
65
where
57
66
F : Folder < Self :: Item > ,
58
67
{
59
- folder. consume_iter ( self . slice . chunk_by ( self . pred ) )
68
+ // TODO (MSRV 1.77):
69
+ // folder.consume_iter(self.slice.chunk_by(self.pred))
70
+
71
+ folder. consume_iter ( std:: iter:: from_fn ( move || {
72
+ if self . slice . is_empty ( ) {
73
+ None
74
+ } else {
75
+ let i = find_first_index ( self . slice , self . pred ) . unwrap_or ( self . slice . len ( ) ) ;
76
+ let ( head, tail) = self . slice . split_at ( i) ;
77
+ self . slice = tail;
78
+ Some ( head)
79
+ }
80
+ } ) )
60
81
}
61
82
}
62
83
@@ -147,11 +168,23 @@ where
147
168
}
148
169
}
149
170
150
- fn fold_with < F > ( self , folder : F ) -> F
171
+ fn fold_with < F > ( mut self , folder : F ) -> F
151
172
where
152
173
F : Folder < Self :: Item > ,
153
174
{
154
- folder. consume_iter ( self . slice . chunk_by_mut ( self . pred ) )
175
+ // TODO (MSRV 1.77):
176
+ // folder.consume_iter(self.slice.chunk_by_mut(self.pred))
177
+
178
+ folder. consume_iter ( std:: iter:: from_fn ( move || {
179
+ if self . slice . is_empty ( ) {
180
+ None
181
+ } else {
182
+ let i = find_first_index ( self . slice , self . pred ) . unwrap_or ( self . slice . len ( ) ) ;
183
+ let ( head, tail) = std:: mem:: take ( & mut self . slice ) . split_at_mut ( i) ;
184
+ self . slice = tail;
185
+ Some ( head)
186
+ }
187
+ } ) )
155
188
}
156
189
}
157
190
0 commit comments