@@ -1086,28 +1086,31 @@ where
1086
1086
I :: Item : Into < R > ,
1087
1087
{ }
1088
1088
1089
- /// An iterator adapter to apply a transformation within a nested `Result`.
1089
+ #[ deprecated( note="Use MapOk instead" , since="0.10" ) ]
1090
+ pub type MapResults < I , F > = MapOk < I , F > ;
1091
+
1092
+ /// An iterator adapter to apply a transformation within a nested `Result::Ok`.
1090
1093
///
1091
- /// See [`.map_results ()`](../trait.Itertools.html#method.map_results ) for more information.
1094
+ /// See [`.map_ok ()`](../trait.Itertools.html#method.map_ok ) for more information.
1092
1095
#[ derive( Clone ) ]
1093
1096
#[ must_use = "iterator adaptors are lazy and do nothing unless consumed" ]
1094
- pub struct MapResults < I , F > {
1097
+ pub struct MapOk < I , F > {
1095
1098
iter : I ,
1096
1099
f : F
1097
1100
}
1098
1101
1099
- /// Create a new `MapResults ` iterator.
1100
- pub fn map_results < I , F , T , U , E > ( iter : I , f : F ) -> MapResults < I , F >
1102
+ /// Create a new `MapOk ` iterator.
1103
+ pub fn map_ok < I , F , T , U , E > ( iter : I , f : F ) -> MapOk < I , F >
1101
1104
where I : Iterator < Item = Result < T , E > > ,
1102
1105
F : FnMut ( T ) -> U ,
1103
1106
{
1104
- MapResults {
1107
+ MapOk {
1105
1108
iter,
1106
1109
f,
1107
1110
}
1108
1111
}
1109
1112
1110
- impl < I , F , T , U , E > Iterator for MapResults < I , F >
1113
+ impl < I , F , T , U , E > Iterator for MapOk < I , F >
1111
1114
where I : Iterator < Item = Result < T , E > > ,
1112
1115
F : FnMut ( T ) -> U ,
1113
1116
{
@@ -1136,6 +1139,141 @@ impl<I, F, T, U, E> Iterator for MapResults<I, F>
1136
1139
}
1137
1140
}
1138
1141
1142
+ /// An iterator adapter to filter values within a nested `Result::Ok`.
1143
+ ///
1144
+ /// See [`.filter_ok()`](../trait.Itertools.html#method.filter_ok) for more information.
1145
+ #[ derive( Clone ) ]
1146
+ #[ must_use = "iterator adaptors are lazy and do nothing unless consumed" ]
1147
+ pub struct FilterOk < I , F > {
1148
+ iter : I ,
1149
+ f : F
1150
+ }
1151
+
1152
+ /// Create a new `FilterOk` iterator.
1153
+ pub fn filter_ok < I , F , T , E > ( iter : I , f : F ) -> FilterOk < I , F >
1154
+ where I : Iterator < Item = Result < T , E > > ,
1155
+ F : FnMut ( & T ) -> bool ,
1156
+ {
1157
+ FilterOk {
1158
+ iter,
1159
+ f,
1160
+ }
1161
+ }
1162
+
1163
+ impl < I , F , T , E > Iterator for FilterOk < I , F >
1164
+ where I : Iterator < Item = Result < T , E > > ,
1165
+ F : FnMut ( & T ) -> bool ,
1166
+ {
1167
+ type Item = Result < T , E > ;
1168
+
1169
+ fn next ( & mut self ) -> Option < Self :: Item > {
1170
+ loop {
1171
+ match self . iter . next ( ) {
1172
+ Some ( Ok ( v) ) => {
1173
+ if ( self . f ) ( & v) {
1174
+ return Some ( Ok ( v) ) ;
1175
+ }
1176
+ } ,
1177
+ Some ( Err ( e) ) => return Some ( Err ( e) ) ,
1178
+ None => return None ,
1179
+ }
1180
+ }
1181
+ }
1182
+
1183
+ fn size_hint ( & self ) -> ( usize , Option < usize > ) {
1184
+ ( 0 , self . iter . size_hint ( ) . 1 )
1185
+ }
1186
+
1187
+ fn fold < Acc , Fold > ( self , init : Acc , fold_f : Fold ) -> Acc
1188
+ where Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
1189
+ {
1190
+ let mut f = self . f ;
1191
+ self . iter . filter ( |v| {
1192
+ v. as_ref ( ) . map ( & mut f) . unwrap_or ( true )
1193
+ } ) . fold ( init, fold_f)
1194
+ }
1195
+
1196
+ fn collect < C > ( self ) -> C
1197
+ where C : FromIterator < Self :: Item >
1198
+ {
1199
+ let mut f = self . f ;
1200
+ self . iter . filter ( |v| {
1201
+ v. as_ref ( ) . map ( & mut f) . unwrap_or ( true )
1202
+ } ) . collect ( )
1203
+ }
1204
+ }
1205
+
1206
+ /// An iterator adapter to filter and apply a transformation on values within a nested `Result::Ok`.
1207
+ ///
1208
+ /// See [`.filter_map_ok()`](../trait.Itertools.html#method.filter_map_ok) for more information.
1209
+ #[ must_use = "iterator adaptors are lazy and do nothing unless consumed" ]
1210
+ pub struct FilterMapOk < I , F > {
1211
+ iter : I ,
1212
+ f : F
1213
+ }
1214
+
1215
+ fn transpose_result < T , E > ( result : Result < Option < T > , E > ) -> Option < Result < T , E > > {
1216
+ match result {
1217
+ Ok ( Some ( v) ) => Some ( Ok ( v) ) ,
1218
+ Ok ( None ) => None ,
1219
+ Err ( e) => Some ( Err ( e) ) ,
1220
+ }
1221
+ }
1222
+
1223
+ /// Create a new `FilterOk` iterator.
1224
+ pub fn filter_map_ok < I , F , T , U , E > ( iter : I , f : F ) -> FilterMapOk < I , F >
1225
+ where I : Iterator < Item = Result < T , E > > ,
1226
+ F : FnMut ( T ) -> Option < U > ,
1227
+ {
1228
+ FilterMapOk {
1229
+ iter,
1230
+ f,
1231
+ }
1232
+ }
1233
+
1234
+ impl < I , F , T , U , E > Iterator for FilterMapOk < I , F >
1235
+ where I : Iterator < Item = Result < T , E > > ,
1236
+ F : FnMut ( T ) -> Option < U > ,
1237
+ {
1238
+ type Item = Result < U , E > ;
1239
+
1240
+ fn next ( & mut self ) -> Option < Self :: Item > {
1241
+ loop {
1242
+ match self . iter . next ( ) {
1243
+ Some ( Ok ( v) ) => {
1244
+ if let Some ( v) = ( self . f ) ( v) {
1245
+ return Some ( Ok ( v) ) ;
1246
+ }
1247
+ } ,
1248
+ Some ( Err ( e) ) => return Some ( Err ( e) ) ,
1249
+ None => return None ,
1250
+ }
1251
+ }
1252
+ }
1253
+
1254
+ fn size_hint ( & self ) -> ( usize , Option < usize > ) {
1255
+ ( 0 , self . iter . size_hint ( ) . 1 )
1256
+ }
1257
+
1258
+ fn fold < Acc , Fold > ( self , init : Acc , fold_f : Fold ) -> Acc
1259
+ where Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
1260
+ {
1261
+ let mut f = self . f ;
1262
+ self . iter . filter_map ( |v| {
1263
+ transpose_result ( v. map ( & mut f) )
1264
+ } ) . fold ( init, fold_f)
1265
+ }
1266
+
1267
+ fn collect < C > ( self ) -> C
1268
+ where C : FromIterator < Self :: Item >
1269
+ {
1270
+ let mut f = self . f ;
1271
+ self . iter . filter_map ( |v| {
1272
+ transpose_result ( v. map ( & mut f) )
1273
+ } ) . collect ( )
1274
+ }
1275
+ }
1276
+
1139
1277
/// An iterator adapter to get the positions of each element that matches a predicate.
1140
1278
///
1141
1279
/// See [`.positions()`](../trait.Itertools.html#method.positions) for more information.
0 commit comments