@@ -2403,51 +2403,47 @@ impl<B, I, St, F> Iterator for Scan<I, St, F> where
2403
2403
/// An iterator that maps each element to an iterator, and yields the elements
2404
2404
/// of the produced iterators.
2405
2405
///
2406
- /// This `struct ` is created by the [`flat_map`] method on [`Iterator`]. See its
2406
+ /// This `type ` is created by the [`flat_map`] method on [`Iterator`]. See its
2407
2407
/// documentation for more.
2408
2408
///
2409
2409
/// [`flat_map`]: trait.Iterator.html#method.flat_map
2410
2410
/// [`Iterator`]: trait.Iterator.html
2411
2411
#[ must_use = "iterator adaptors are lazy and do nothing unless consumed" ]
2412
2412
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
2413
- #[ derive( Clone ) ]
2414
- pub struct FlatMap < I , U : IntoIterator , F > {
2415
- iter : I ,
2416
- f : F ,
2417
- frontiter : Option < U :: IntoIter > ,
2418
- backiter : Option < U :: IntoIter > ,
2419
- }
2413
+ type FlatMap < I , U , F > = Flatten < Map < I , F > , <U as IntoIterator >:: IntoIter > ;
2420
2414
2421
- #[ stable( feature = "core_impl_debug" , since = "1.9.0" ) ]
2422
- impl < I : fmt:: Debug , U : IntoIterator , F > fmt:: Debug for FlatMap < I , U , F >
2423
- where U :: IntoIter : fmt:: Debug
2424
- {
2425
- fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
2426
- f. debug_struct ( "FlatMap" )
2427
- . field ( "iter" , & self . iter )
2428
- . field ( "frontiter" , & self . frontiter )
2429
- . field ( "backiter" , & self . backiter )
2430
- . finish ( )
2431
- }
2415
+ /// An iterator that flattens one level of nesting in an iterator of things
2416
+ /// that can be turned into iterators.
2417
+ ///
2418
+ /// This `struct` is created by the [`flatten`] method on [`Iterator`]. See its
2419
+ /// documentation for more.
2420
+ ///
2421
+ /// [`flatten`]: trait.Iterator.html#method.flatten
2422
+ /// [`Iterator`]: trait.Iterator.html
2423
+ #[ must_use = "iterator adaptors are lazy and do nothing unless consumed" ]
2424
+ #[ unstable( feature = "iterator_flatten" , issue = "0" ) ]
2425
+ #[ derive( Clone , Debug ) ]
2426
+ pub struct Flatten < I , U > {
2427
+ iter : I ,
2428
+ frontiter : Option < U > ,
2429
+ backiter : Option < U > ,
2432
2430
}
2433
2431
2434
- #[ stable ( feature = "rust1 " , since = "1.0. 0" ) ]
2435
- impl < I : Iterator , U : IntoIterator , F > Iterator for FlatMap < I , U , F >
2436
- where F : FnMut ( I :: Item ) -> U ,
2432
+ #[ unstable ( feature = "iterator_flatten " , issue = "0" ) ]
2433
+ impl < I : Iterator , U : Iterator > Iterator for Flatten < I , U >
2434
+ where I :: Item : IntoIterator < IntoIter = U , Item = U :: Item >
2437
2435
{
2438
2436
type Item = U :: Item ;
2439
2437
2440
2438
#[ inline]
2441
2439
fn next ( & mut self ) -> Option < U :: Item > {
2442
2440
loop {
2443
2441
if let Some ( ref mut inner) = self . frontiter {
2444
- if let Some ( x) = inner. by_ref ( ) . next ( ) {
2445
- return Some ( x)
2446
- }
2442
+ if let elt@Some ( _) = inner. next ( ) { return elt }
2447
2443
}
2448
- match self . iter . next ( ) . map ( & mut self . f ) {
2444
+ match self . iter . next ( ) {
2449
2445
None => return self . backiter . as_mut ( ) . and_then ( |it| it. next ( ) ) ,
2450
- next => self . frontiter = next . map ( IntoIterator :: into_iter) ,
2446
+ Some ( inner ) => self . frontiter = Some ( inner . into_iter ( ) ) ,
2451
2447
}
2452
2448
}
2453
2449
}
@@ -2473,10 +2469,9 @@ impl<I: Iterator, U: IntoIterator, F> Iterator for FlatMap<I, U, F>
2473
2469
self . frontiter = None ;
2474
2470
2475
2471
{
2476
- let f = & mut self . f ;
2477
2472
let frontiter = & mut self . frontiter ;
2478
2473
init = self . iter . try_fold ( init, |acc, x| {
2479
- let mut mid = f ( x ) . into_iter ( ) ;
2474
+ let mut mid = x . into_iter ( ) ;
2480
2475
let r = mid. try_fold ( acc, & mut fold) ;
2481
2476
* frontiter = Some ( mid) ;
2482
2477
r
@@ -2497,27 +2492,24 @@ impl<I: Iterator, U: IntoIterator, F> Iterator for FlatMap<I, U, F>
2497
2492
where Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
2498
2493
{
2499
2494
self . frontiter . into_iter ( )
2500
- . chain ( self . iter . map ( self . f ) . map ( U :: into_iter) )
2495
+ . chain ( self . iter . map ( IntoIterator :: into_iter) )
2501
2496
. chain ( self . backiter )
2502
2497
. fold ( init, |acc, iter| iter. fold ( acc, & mut fold) )
2503
2498
}
2504
2499
}
2505
2500
2506
- #[ stable( feature = "rust1" , since = "1.0.0" ) ]
2507
- impl < I : DoubleEndedIterator , U , F > DoubleEndedIterator for FlatMap < I , U , F > where
2508
- F : FnMut ( I :: Item ) -> U ,
2509
- U : IntoIterator ,
2510
- U :: IntoIter : DoubleEndedIterator
2501
+ #[ unstable( feature = "iterator_flatten" , issue = "0" ) ]
2502
+ impl < I , U > DoubleEndedIterator for Flatten < I , U >
2503
+ where I : DoubleEndedIterator , U : DoubleEndedIterator ,
2504
+ I :: Item : IntoIterator < IntoIter = U , Item = U :: Item >
2511
2505
{
2512
2506
#[ inline]
2513
2507
fn next_back ( & mut self ) -> Option < U :: Item > {
2514
2508
loop {
2515
2509
if let Some ( ref mut inner) = self . backiter {
2516
- if let Some ( y) = inner. next_back ( ) {
2517
- return Some ( y)
2518
- }
2510
+ if let elt@Some ( _) = inner. next_back ( ) { return elt }
2519
2511
}
2520
- match self . iter . next_back ( ) . map ( & mut self . f ) {
2512
+ match self . iter . next_back ( ) {
2521
2513
None => return self . frontiter . as_mut ( ) . and_then ( |it| it. next_back ( ) ) ,
2522
2514
next => self . backiter = next. map ( IntoIterator :: into_iter) ,
2523
2515
}
@@ -2534,10 +2526,9 @@ impl<I: DoubleEndedIterator, U, F> DoubleEndedIterator for FlatMap<I, U, F> wher
2534
2526
self . backiter = None ;
2535
2527
2536
2528
{
2537
- let f = & mut self . f ;
2538
2529
let backiter = & mut self . backiter ;
2539
2530
init = self . iter . try_rfold ( init, |acc, x| {
2540
- let mut mid = f ( x ) . into_iter ( ) ;
2531
+ let mut mid = x . into_iter ( ) ;
2541
2532
let r = mid. try_rfold ( acc, & mut fold) ;
2542
2533
* backiter = Some ( mid) ;
2543
2534
r
@@ -2558,15 +2549,15 @@ impl<I: DoubleEndedIterator, U, F> DoubleEndedIterator for FlatMap<I, U, F> wher
2558
2549
where Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
2559
2550
{
2560
2551
self . frontiter . into_iter ( )
2561
- . chain ( self . iter . map ( self . f ) . map ( U :: into_iter) )
2552
+ . chain ( self . iter . map ( IntoIterator :: into_iter) )
2562
2553
. chain ( self . backiter )
2563
2554
. rfold ( init, |acc, iter| iter. rfold ( acc, & mut fold) )
2564
2555
}
2565
2556
}
2566
2557
2567
- #[ unstable( feature = "fused" , issue = "35602 " ) ]
2568
- impl < I , U , F > FusedIterator for FlatMap < I , U , F >
2569
- where I : FusedIterator , U : IntoIterator , F : FnMut ( I :: Item ) -> U { }
2558
+ #[ unstable( feature = "fused" , issue = "0 " ) ]
2559
+ impl < I : FusedIterator , U : Iterator > FusedIterator for Flatten < I , U >
2560
+ where I :: Item : IntoIterator < IntoIter = U , Item = U :: Item > { }
2570
2561
2571
2562
/// An iterator that yields `None` forever after the underlying iterator
2572
2563
/// yields `None` once.
0 commit comments