@@ -529,7 +529,7 @@ impl<A, T: Iterator<A>> IteratorUtil<A> for T {
529
529
#[ inline]
530
530
fn flat_map_ < ' r , B , U : Iterator < B > > ( self , f : & ' r fn ( A ) -> U )
531
531
-> FlatMap < ' r , A , T , U > {
532
- FlatMap { iter : self , f : f, subiter : None }
532
+ FlatMap { iter : self , f : f, frontiter : None , backiter : None }
533
533
}
534
534
535
535
// FIXME: #5898: should be called `peek`
@@ -1251,22 +1251,44 @@ impl<'self, A, B, T: Iterator<A>, St> Iterator<B> for Scan<'self, A, B, T, St> {
1251
1251
pub struct FlatMap < ' self , A , T , U > {
1252
1252
priv iter: T ,
1253
1253
priv f: & ' self fn ( A ) -> U ,
1254
- priv subiter: Option < U > ,
1254
+ priv frontiter: Option < U > ,
1255
+ priv backiter: Option < U > ,
1255
1256
}
1256
1257
1257
1258
impl <' self , A , T : Iterator < A > , B , U : Iterator < B > > Iterator < B > for
1258
1259
FlatMap < ' self , A , T , U > {
1259
1260
#[ inline]
1260
1261
fn next( & mut self ) -> Option < B > {
1261
1262
loop {
1262
- for self . subiter . mut_iter( ) . advance |inner| {
1263
+ for self . frontiter . mut_iter( ) . advance |inner| {
1263
1264
for inner. advance |x| {
1264
1265
return Some ( x)
1265
1266
}
1266
1267
}
1267
1268
match self . iter. next( ) . map_consume( |x| ( self . f) ( x) ) {
1268
- None => return None ,
1269
- next => self . subiter = next,
1269
+ None => return self . backiter. chain_mut_ref( |it| it. next( ) ) ,
1270
+ next => self . frontiter = next,
1271
+ }
1272
+ }
1273
+ }
1274
+ }
1275
+
1276
+ impl <' self ,
1277
+ A , T : DoubleEndedIterator < A > ,
1278
+ B , U : DoubleEndedIterator < B > > DoubleEndedIterator < B >
1279
+ for FlatMap < ' self , A , T , U > {
1280
+ #[ inline]
1281
+ fn next_back( & mut self ) -> Option < B > {
1282
+ loop {
1283
+ for self . backiter. mut_iter( ) . advance |inner| {
1284
+ match inner. next_back( ) {
1285
+ None => ( ) ,
1286
+ y => return y
1287
+ }
1288
+ }
1289
+ match self . iter. next_back( ) . map_consume( |x| ( self . f) ( x) ) {
1290
+ None => return self . frontiter. chain_mut_ref( |it| it. next_back( ) ) ,
1291
+ next => self . backiter = next,
1270
1292
}
1271
1293
}
1272
1294
}
@@ -1768,6 +1790,23 @@ mod tests {
1768
1790
assert_eq ! ( it. next_back( ) , None )
1769
1791
}
1770
1792
1793
+ #[ test]
1794
+ fn test_double_ended_flat_map ( ) {
1795
+ let u = [ 0 u, 1 ] ;
1796
+ let v = [ 5 , 6 , 7 , 8 ] ;
1797
+ let mut it = u. iter ( ) . flat_map_ ( |x| v. slice ( * x, v. len ( ) ) . iter ( ) ) ;
1798
+ assert_eq ! ( it. next_back( ) . unwrap( ) , & 8 ) ;
1799
+ assert_eq ! ( it. next( ) . unwrap( ) , & 5 ) ;
1800
+ assert_eq ! ( it. next_back( ) . unwrap( ) , & 7 ) ;
1801
+ assert_eq ! ( it. next_back( ) . unwrap( ) , & 6 ) ;
1802
+ assert_eq ! ( it. next_back( ) . unwrap( ) , & 8 ) ;
1803
+ assert_eq ! ( it. next( ) . unwrap( ) , & 6 ) ;
1804
+ assert_eq ! ( it. next_back( ) . unwrap( ) , & 7 ) ;
1805
+ assert_eq ! ( it. next_back( ) , None ) ;
1806
+ assert_eq ! ( it. next( ) , None ) ;
1807
+ assert_eq ! ( it. next_back( ) , None ) ;
1808
+ }
1809
+
1771
1810
#[ test]
1772
1811
fn test_random_access_chain ( ) {
1773
1812
let xs = [ 1 , 2 , 3 , 4 , 5 ] ;
0 commit comments