@@ -1192,6 +1192,72 @@ impl<I, F, T, E> Iterator for FilterResults<I, F>
1192
1192
}
1193
1193
}
1194
1194
1195
+ /// An iterator adapter to filter and apply a transformation on values within a nested `Result`.
1196
+ ///
1197
+ /// See [`.filter_map_results()`](../trait.Itertools.html#method.filter_map_results) for more information.
1198
+ #[ derive( Clone ) ]
1199
+ #[ must_use = "iterator adaptors are lazy and do nothing unless consumed" ]
1200
+ pub struct FilterMapResults < I , F > {
1201
+ iter : I ,
1202
+ f : F
1203
+ }
1204
+
1205
+ /// Create a new `FilterResults` iterator.
1206
+ pub fn filter_map_results < I , F , T , U , E > ( iter : I , f : F ) -> FilterMapResults < I , F >
1207
+ where I : Iterator < Item = Result < T , E > > ,
1208
+ F : FnMut ( T ) -> Option < U > ,
1209
+ {
1210
+ FilterMapResults {
1211
+ iter,
1212
+ f,
1213
+ }
1214
+ }
1215
+
1216
+ impl < I , F , T , U , E > Iterator for FilterMapResults < I , F >
1217
+ where I : Iterator < Item = Result < T , E > > ,
1218
+ F : FnMut ( T ) -> Option < U > ,
1219
+ {
1220
+ type Item = Result < U , E > ;
1221
+
1222
+ fn next ( & mut self ) -> Option < Self :: Item > {
1223
+ loop {
1224
+ match self . iter . next ( ) {
1225
+ Some ( Ok ( v) ) => {
1226
+ if let Some ( v) = ( self . f ) ( v) {
1227
+ return Some ( Ok ( v) ) ;
1228
+ }
1229
+ } ,
1230
+ Some ( Err ( e) ) => return Some ( Err ( e) ) ,
1231
+ None => return None ,
1232
+ }
1233
+ }
1234
+ }
1235
+
1236
+ fn size_hint ( & self ) -> ( usize , Option < usize > ) {
1237
+ ( 0 , self . iter . size_hint ( ) . 1 )
1238
+ }
1239
+
1240
+ fn fold < Acc , Fold > ( self , init : Acc , mut fold_f : Fold ) -> Acc
1241
+ where Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
1242
+ {
1243
+ 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
+ } )
1251
+ }
1252
+
1253
+ fn collect < C > ( self ) -> C
1254
+ where C : FromIterator < Self :: Item >
1255
+ {
1256
+ let mut f = self . f ;
1257
+ self . iter . filter_map ( move |v| v. map ( & mut f) . transpose ( ) ) . collect ( )
1258
+ }
1259
+ }
1260
+
1195
1261
/// An iterator adapter to get the positions of each element that matches a predicate.
1196
1262
///
1197
1263
/// See [`.positions()`](../trait.Itertools.html#method.positions) for more information.
0 commit comments