@@ -1124,6 +1124,74 @@ impl<I, F, T, U, E> Iterator for MapResults<I, F>
1124
1124
}
1125
1125
}
1126
1126
1127
+ /// An iterator adapter to filter values within a nested `Result`.
1128
+ ///
1129
+ /// See [`.filter_results()`](../trait.Itertools.html#method.filter_results) for more information.
1130
+ #[ derive( Clone ) ]
1131
+ #[ must_use = "iterator adaptors are lazy and do nothing unless consumed" ]
1132
+ pub struct FilterResults < I , F > {
1133
+ iter : I ,
1134
+ f : F
1135
+ }
1136
+
1137
+ /// Create a new `FilterResults` iterator.
1138
+ pub fn filter_results < I , F , T , E > ( iter : I , f : F ) -> FilterResults < I , F >
1139
+ where I : Iterator < Item = Result < T , E > > ,
1140
+ F : FnMut ( & T ) -> bool ,
1141
+ {
1142
+ FilterResults {
1143
+ iter,
1144
+ f,
1145
+ }
1146
+ }
1147
+
1148
+ impl < I , F , T , E > Iterator for FilterResults < I , F >
1149
+ where I : Iterator < Item = Result < T , E > > ,
1150
+ F : FnMut ( & T ) -> bool ,
1151
+ {
1152
+ type Item = Result < T , E > ;
1153
+
1154
+ fn next ( & mut self ) -> Option < Self :: Item > {
1155
+ loop {
1156
+ match self . iter . next ( ) {
1157
+ Some ( Ok ( v) ) => {
1158
+ if ( self . f ) ( & v) {
1159
+ return Some ( Ok ( v) ) ;
1160
+ }
1161
+ } ,
1162
+ Some ( Err ( e) ) => return Some ( Err ( e) ) ,
1163
+ None => return None ,
1164
+ }
1165
+ }
1166
+ }
1167
+
1168
+ fn size_hint ( & self ) -> ( usize , Option < usize > ) {
1169
+ ( 0 , self . iter . size_hint ( ) . 1 )
1170
+ }
1171
+
1172
+ fn fold < Acc , Fold > ( self , init : Acc , mut fold_f : Fold ) -> Acc
1173
+ where Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
1174
+ {
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
+ } )
1183
+ }
1184
+
1185
+ fn collect < C > ( self ) -> C
1186
+ where C : FromIterator < Self :: Item >
1187
+ {
1188
+ let mut f = self . f ;
1189
+ self . iter . filter ( move |v| {
1190
+ v. as_ref ( ) . map ( & mut f) . unwrap_or ( true )
1191
+ } ) . collect ( )
1192
+ }
1193
+ }
1194
+
1127
1195
/// An iterator adapter to get the positions of each element that matches a predicate.
1128
1196
///
1129
1197
/// See [`.positions()`](../trait.Itertools.html#method.positions) for more information.
0 commit comments