@@ -1169,24 +1169,20 @@ impl<I, F, T, E> Iterator for FilterResults<I, F>
1169
1169
( 0 , self . iter . size_hint ( ) . 1 )
1170
1170
}
1171
1171
1172
- fn fold < Acc , Fold > ( self , init : Acc , mut fold_f : Fold ) -> Acc
1172
+ fn fold < Acc , Fold > ( self , init : Acc , fold_f : Fold ) -> Acc
1173
1173
where Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
1174
1174
{
1175
1175
let mut f = self . f ;
1176
- self . iter . fold ( init, move |acc, v| {
1177
- if v. as_ref ( ) . map ( & mut f) . unwrap_or ( true ) {
1178
- fold_f ( acc, v)
1179
- } else {
1180
- acc
1181
- }
1182
- } )
1176
+ self . iter . filter ( |v| {
1177
+ v. as_ref ( ) . map ( & mut f) . unwrap_or ( true )
1178
+ } ) . fold ( init, fold_f)
1183
1179
}
1184
1180
1185
1181
fn collect < C > ( self ) -> C
1186
1182
where C : FromIterator < Self :: Item >
1187
1183
{
1188
1184
let mut f = self . f ;
1189
- self . iter . filter ( move |v| {
1185
+ self . iter . filter ( |v| {
1190
1186
v. as_ref ( ) . map ( & mut f) . unwrap_or ( true )
1191
1187
} ) . collect ( )
1192
1188
}
@@ -1202,6 +1198,14 @@ pub struct FilterMapResults<I, F> {
1202
1198
f : F
1203
1199
}
1204
1200
1201
+ fn transpose_result < T , E > ( result : Result < Option < T > , E > ) -> Option < Result < T , E > > {
1202
+ match result {
1203
+ Ok ( Some ( v) ) => Some ( Ok ( v) ) ,
1204
+ Ok ( None ) => None ,
1205
+ Err ( e) => Some ( Err ( e) ) ,
1206
+ }
1207
+ }
1208
+
1205
1209
/// Create a new `FilterResults` iterator.
1206
1210
pub fn filter_map_results < I , F , T , U , E > ( iter : I , f : F ) -> FilterMapResults < I , F >
1207
1211
where I : Iterator < Item = Result < T , E > > ,
@@ -1237,24 +1241,22 @@ impl<I, F, T, U, E> Iterator for FilterMapResults<I, F>
1237
1241
( 0 , self . iter . size_hint ( ) . 1 )
1238
1242
}
1239
1243
1240
- fn fold < Acc , Fold > ( self , init : Acc , mut fold_f : Fold ) -> Acc
1244
+ fn fold < Acc , Fold > ( self , init : Acc , fold_f : Fold ) -> Acc
1241
1245
where Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
1242
1246
{
1243
1247
let mut f = self . f ;
1244
- self . iter . fold ( init, move |acc, v| {
1245
- if let Some ( v) = v. map ( & mut f) . transpose ( ) {
1246
- fold_f ( acc, v)
1247
- } else {
1248
- acc
1249
- }
1250
- } )
1248
+ self . iter . filter_map ( |v| {
1249
+ transpose_result ( v. map ( & mut f) )
1250
+ } ) . fold ( init, fold_f)
1251
1251
}
1252
1252
1253
1253
fn collect < C > ( self ) -> C
1254
1254
where C : FromIterator < Self :: Item >
1255
1255
{
1256
1256
let mut f = self . f ;
1257
- self . iter . filter_map ( move |v| v. map ( & mut f) . transpose ( ) ) . collect ( )
1257
+ self . iter . filter_map ( |v| {
1258
+ transpose_result ( v. map ( & mut f) )
1259
+ } ) . collect ( )
1258
1260
}
1259
1261
}
1260
1262
0 commit comments