@@ -143,6 +143,18 @@ impl<I> Copied<I> {
143
143
}
144
144
}
145
145
146
+ fn copy_fold < T : Copy , Acc > (
147
+ mut f : impl FnMut ( Acc , T ) -> Acc ,
148
+ ) -> impl FnMut ( Acc , & T ) -> Acc {
149
+ move |acc, & elt| f ( acc, elt)
150
+ }
151
+
152
+ fn copy_try_fold < T : Copy , Acc , R > (
153
+ mut f : impl FnMut ( Acc , T ) -> R ,
154
+ ) -> impl FnMut ( Acc , & T ) -> R {
155
+ move |acc, & elt| f ( acc, elt)
156
+ }
157
+
146
158
#[ stable( feature = "iter_copied" , since = "1.36.0" ) ]
147
159
impl < ' a , I , T : ' a > Iterator for Copied < I >
148
160
where I : Iterator < Item =& ' a T > , T : Copy
@@ -157,16 +169,16 @@ impl<'a, I, T: 'a> Iterator for Copied<I>
157
169
self . it . size_hint ( )
158
170
}
159
171
160
- fn try_fold < B , F , R > ( & mut self , init : B , mut f : F ) -> R where
172
+ fn try_fold < B , F , R > ( & mut self , init : B , f : F ) -> R where
161
173
Self : Sized , F : FnMut ( B , Self :: Item ) -> R , R : Try < Ok =B >
162
174
{
163
- self . it . try_fold ( init, move |acc , & elt| f ( acc , elt ) )
175
+ self . it . try_fold ( init, copy_try_fold ( f ) )
164
176
}
165
177
166
- fn fold < Acc , F > ( self , init : Acc , mut f : F ) -> Acc
178
+ fn fold < Acc , F > ( self , init : Acc , f : F ) -> Acc
167
179
where F : FnMut ( Acc , Self :: Item ) -> Acc ,
168
180
{
169
- self . it . fold ( init, move |acc , & elt| f ( acc , elt ) )
181
+ self . it . fold ( init, copy_fold ( f ) )
170
182
}
171
183
}
172
184
@@ -178,16 +190,16 @@ impl<'a, I, T: 'a> DoubleEndedIterator for Copied<I>
178
190
self . it . next_back ( ) . copied ( )
179
191
}
180
192
181
- fn try_rfold < B , F , R > ( & mut self , init : B , mut f : F ) -> R where
193
+ fn try_rfold < B , F , R > ( & mut self , init : B , f : F ) -> R where
182
194
Self : Sized , F : FnMut ( B , Self :: Item ) -> R , R : Try < Ok =B >
183
195
{
184
- self . it . try_rfold ( init, move |acc , & elt| f ( acc , elt ) )
196
+ self . it . try_rfold ( init, copy_try_fold ( f ) )
185
197
}
186
198
187
- fn rfold < Acc , F > ( self , init : Acc , mut f : F ) -> Acc
199
+ fn rfold < Acc , F > ( self , init : Acc , f : F ) -> Acc
188
200
where F : FnMut ( Acc , Self :: Item ) -> Acc ,
189
201
{
190
- self . it . rfold ( init, move |acc , & elt| f ( acc , elt ) )
202
+ self . it . rfold ( init, copy_fold ( f ) )
191
203
}
192
204
}
193
205
@@ -248,6 +260,12 @@ impl<I> Cloned<I> {
248
260
}
249
261
}
250
262
263
+ fn clone_try_fold < T : Clone , Acc , R > (
264
+ mut f : impl FnMut ( Acc , T ) -> R ,
265
+ ) -> impl FnMut ( Acc , & T ) -> R {
266
+ move |acc, elt| f ( acc, elt. clone ( ) )
267
+ }
268
+
251
269
#[ stable( feature = "iter_cloned" , since = "1.1.0" ) ]
252
270
impl < ' a , I , T : ' a > Iterator for Cloned < I >
253
271
where I : Iterator < Item =& ' a T > , T : Clone
@@ -262,16 +280,16 @@ impl<'a, I, T: 'a> Iterator for Cloned<I>
262
280
self . it . size_hint ( )
263
281
}
264
282
265
- fn try_fold < B , F , R > ( & mut self , init : B , mut f : F ) -> R where
283
+ fn try_fold < B , F , R > ( & mut self , init : B , f : F ) -> R where
266
284
Self : Sized , F : FnMut ( B , Self :: Item ) -> R , R : Try < Ok =B >
267
285
{
268
- self . it . try_fold ( init, move |acc , elt| f ( acc , elt . clone ( ) ) )
286
+ self . it . try_fold ( init, clone_try_fold ( f ) )
269
287
}
270
288
271
- fn fold < Acc , F > ( self , init : Acc , mut f : F ) -> Acc
289
+ fn fold < Acc , F > ( self , init : Acc , f : F ) -> Acc
272
290
where F : FnMut ( Acc , Self :: Item ) -> Acc ,
273
291
{
274
- self . it . fold ( init, move |acc , elt| f ( acc , elt . clone ( ) ) )
292
+ self . it . map ( T :: clone ) . fold ( init, f )
275
293
}
276
294
}
277
295
@@ -283,16 +301,16 @@ impl<'a, I, T: 'a> DoubleEndedIterator for Cloned<I>
283
301
self . it . next_back ( ) . cloned ( )
284
302
}
285
303
286
- fn try_rfold < B , F , R > ( & mut self , init : B , mut f : F ) -> R where
304
+ fn try_rfold < B , F , R > ( & mut self , init : B , f : F ) -> R where
287
305
Self : Sized , F : FnMut ( B , Self :: Item ) -> R , R : Try < Ok =B >
288
306
{
289
- self . it . try_rfold ( init, move |acc , elt| f ( acc , elt . clone ( ) ) )
307
+ self . it . try_rfold ( init, clone_try_fold ( f ) )
290
308
}
291
309
292
- fn rfold < Acc , F > ( self , init : Acc , mut f : F ) -> Acc
310
+ fn rfold < Acc , F > ( self , init : Acc , f : F ) -> Acc
293
311
where F : FnMut ( Acc , Self :: Item ) -> Acc ,
294
312
{
295
- self . it . rfold ( init, move |acc , elt| f ( acc , elt . clone ( ) ) )
313
+ self . it . map ( T :: clone ) . rfold ( init, f )
296
314
}
297
315
}
298
316
0 commit comments