@@ -2403,14 +2403,87 @@ 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 `type ` is created by the [`flat_map`] method on [`Iterator`]. See its
2406
+ /// This `struct ` 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
- type FlatMap < I , U , F > = Flatten < Map < I , F > , <U as IntoIterator >:: IntoIter > ;
2413
+ pub struct FlatMap < I , U : IntoIterator , F > {
2414
+ inner : FlattenCompat < Map < I , F > , <U as IntoIterator >:: IntoIter >
2415
+ }
2416
+
2417
+ #[ stable( feature = "rust1" , since = "1.0.0" ) ]
2418
+ impl < I : Clone , U : Clone + IntoIterator , F : Clone > Clone for FlatMap < I , U , F >
2419
+ where <U as IntoIterator >:: IntoIter : Clone
2420
+ {
2421
+ fn clone ( & self ) -> Self { FlatMap { inner : self . inner . clone ( ) } }
2422
+ }
2423
+
2424
+ #[ stable( feature = "core_impl_debug" , since = "1.9.0" ) ]
2425
+ impl < I : fmt:: Debug , U : IntoIterator , F > fmt:: Debug for FlatMap < I , U , F >
2426
+ where U :: IntoIter : fmt:: Debug
2427
+ {
2428
+ fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
2429
+ f. debug_struct ( "FlatMap" ) . field ( "inner" , & self . inner ) . finish ( )
2430
+ }
2431
+ }
2432
+
2433
+ #[ stable( feature = "rust1" , since = "1.0.0" ) ]
2434
+ impl < I : Iterator , U : IntoIterator , F > Iterator for FlatMap < I , U , F >
2435
+ where F : FnMut ( I :: Item ) -> U ,
2436
+ {
2437
+ type Item = U :: Item ;
2438
+
2439
+ #[ inline]
2440
+ fn next ( & mut self ) -> Option < U :: Item > { self . inner . next ( ) }
2441
+
2442
+ #[ inline]
2443
+ fn size_hint ( & self ) -> ( usize , Option < usize > ) { self . inner . size_hint ( ) }
2444
+
2445
+ #[ inline]
2446
+ fn try_fold < Acc , Fold , R > ( & mut self , init : Acc , fold : Fold ) -> R where
2447
+ Self : Sized , Fold : FnMut ( Acc , Self :: Item ) -> R , R : Try < Ok =Acc >
2448
+ {
2449
+ self . inner . try_fold ( init, fold)
2450
+ }
2451
+
2452
+ #[ inline]
2453
+ fn fold < Acc , Fold > ( self , init : Acc , fold : Fold ) -> Acc
2454
+ where Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
2455
+ {
2456
+ self . inner . fold ( init, fold)
2457
+ }
2458
+ }
2459
+
2460
+ #[ stable( feature = "rust1" , since = "1.0.0" ) ]
2461
+ impl < I : DoubleEndedIterator , U , F > DoubleEndedIterator for FlatMap < I , U , F >
2462
+ where F : FnMut ( I :: Item ) -> U ,
2463
+ U : IntoIterator ,
2464
+ U :: IntoIter : DoubleEndedIterator
2465
+ {
2466
+ #[ inline]
2467
+ fn next_back ( & mut self ) -> Option < U :: Item > { self . inner . next_back ( ) }
2468
+
2469
+ #[ inline]
2470
+ fn try_rfold < Acc , Fold , R > ( & mut self , init : Acc , fold : Fold ) -> R where
2471
+ Self : Sized , Fold : FnMut ( Acc , Self :: Item ) -> R , R : Try < Ok =Acc >
2472
+ {
2473
+ self . inner . try_rfold ( init, fold)
2474
+ }
2475
+
2476
+ #[ inline]
2477
+ fn rfold < Acc , Fold > ( self , init : Acc , fold : Fold ) -> Acc
2478
+ where Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
2479
+ {
2480
+ self . inner . rfold ( init, fold)
2481
+ }
2482
+ }
2483
+
2484
+ #[ unstable( feature = "fused" , issue = "35602" ) ]
2485
+ impl < I , U , F > FusedIterator for FlatMap < I , U , F >
2486
+ where I : FusedIterator , U : IntoIterator , F : FnMut ( I :: Item ) -> U { }
2414
2487
2415
2488
/// An iterator that flattens one level of nesting in an iterator of things
2416
2489
/// that can be turned into iterators.
@@ -2422,16 +2495,102 @@ type FlatMap<I, U, F> = Flatten<Map<I, F>, <U as IntoIterator>::IntoIter>;
2422
2495
/// [`Iterator`]: trait.Iterator.html
2423
2496
#[ must_use = "iterator adaptors are lazy and do nothing unless consumed" ]
2424
2497
#[ unstable( feature = "iterator_flatten" , issue = "0" ) ]
2498
+ pub struct Flatten < I : Iterator >
2499
+ where I :: Item : IntoIterator {
2500
+ inner : FlattenCompat < I , <I :: Item as IntoIterator >:: IntoIter > ,
2501
+ }
2502
+
2503
+ #[ unstable( feature = "iterator_flatten" , issue = "0" ) ]
2504
+ impl < I , U > fmt:: Debug for Flatten < I >
2505
+ where I : Iterator + fmt:: Debug , U : Iterator + fmt:: Debug ,
2506
+ I :: Item : IntoIterator < IntoIter = U , Item = U :: Item > ,
2507
+ {
2508
+ fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
2509
+ f. debug_struct ( "Flatten" ) . field ( "inner" , & self . inner ) . finish ( )
2510
+ }
2511
+ }
2512
+
2513
+ #[ unstable( feature = "iterator_flatten" , issue = "0" ) ]
2514
+ impl < I , U > Clone for Flatten < I >
2515
+ where I : Iterator + Clone , U : Iterator + Clone ,
2516
+ I :: Item : IntoIterator < IntoIter = U , Item = U :: Item > ,
2517
+ {
2518
+ fn clone ( & self ) -> Self { Flatten { inner : self . inner . clone ( ) } }
2519
+ }
2520
+
2521
+ #[ unstable( feature = "iterator_flatten" , issue = "0" ) ]
2522
+ impl < I , U > Iterator for Flatten < I >
2523
+ where I : Iterator , U : Iterator ,
2524
+ I :: Item : IntoIterator < IntoIter = U , Item = U :: Item >
2525
+ {
2526
+ type Item = U :: Item ;
2527
+
2528
+ #[ inline]
2529
+ fn next ( & mut self ) -> Option < U :: Item > { self . inner . next ( ) }
2530
+
2531
+ #[ inline]
2532
+ fn size_hint ( & self ) -> ( usize , Option < usize > ) { self . inner . size_hint ( ) }
2533
+
2534
+ #[ inline]
2535
+ fn try_fold < Acc , Fold , R > ( & mut self , init : Acc , fold : Fold ) -> R where
2536
+ Self : Sized , Fold : FnMut ( Acc , Self :: Item ) -> R , R : Try < Ok =Acc >
2537
+ {
2538
+ self . inner . try_fold ( init, fold)
2539
+ }
2540
+
2541
+ #[ inline]
2542
+ fn fold < Acc , Fold > ( self , init : Acc , fold : Fold ) -> Acc
2543
+ where Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
2544
+ {
2545
+ self . inner . fold ( init, fold)
2546
+ }
2547
+ }
2548
+
2549
+ #[ unstable( feature = "iterator_flatten" , issue = "0" ) ]
2550
+ impl < I , U > DoubleEndedIterator for Flatten < I >
2551
+ where I : DoubleEndedIterator , U : DoubleEndedIterator ,
2552
+ I :: Item : IntoIterator < IntoIter = U , Item = U :: Item >
2553
+ {
2554
+ #[ inline]
2555
+ fn next_back ( & mut self ) -> Option < U :: Item > { self . inner . next_back ( ) }
2556
+
2557
+ #[ inline]
2558
+ fn try_rfold < Acc , Fold , R > ( & mut self , init : Acc , fold : Fold ) -> R where
2559
+ Self : Sized , Fold : FnMut ( Acc , Self :: Item ) -> R , R : Try < Ok =Acc >
2560
+ {
2561
+ self . inner . try_rfold ( init, fold)
2562
+ }
2563
+
2564
+ #[ inline]
2565
+ fn rfold < Acc , Fold > ( self , init : Acc , fold : Fold ) -> Acc
2566
+ where Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
2567
+ {
2568
+ self . inner . rfold ( init, fold)
2569
+ }
2570
+ }
2571
+
2572
+ #[ unstable( feature = "fused" , issue = "35602" ) ]
2573
+ impl < I , U > FusedIterator for Flatten < I >
2574
+ where I : FusedIterator , U : Iterator ,
2575
+ I :: Item : IntoIterator < IntoIter = U , Item = U :: Item > { }
2576
+
2577
+ /// Adapts an iterator by flattening it, for use in `flatten()` and `flat_map()`.
2578
+ fn flatten_compat < I , U > ( iter : I ) -> FlattenCompat < I , U > {
2579
+ FlattenCompat { iter, frontiter : None , backiter : None }
2580
+ }
2581
+
2582
+ /// Real logic of both `Flatten` and `FlatMap` which simply delegate to
2583
+ /// this type.
2425
2584
#[ derive( Clone , Debug ) ]
2426
- pub struct Flatten < I , U > {
2585
+ struct FlattenCompat < I , U > {
2427
2586
iter : I ,
2428
2587
frontiter : Option < U > ,
2429
2588
backiter : Option < U > ,
2430
2589
}
2431
2590
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 >
2591
+ impl < I , U > Iterator for FlattenCompat < I , U >
2592
+ where I : Iterator , U : Iterator ,
2593
+ I :: Item : IntoIterator < IntoIter = U , Item = U :: Item >
2435
2594
{
2436
2595
type Item = U :: Item ;
2437
2596
@@ -2498,8 +2657,7 @@ impl<I: Iterator, U: Iterator> Iterator for Flatten<I, U>
2498
2657
}
2499
2658
}
2500
2659
2501
- #[ unstable( feature = "iterator_flatten" , issue = "0" ) ]
2502
- impl < I , U > DoubleEndedIterator for Flatten < I , U >
2660
+ impl < I , U > DoubleEndedIterator for FlattenCompat < I , U >
2503
2661
where I : DoubleEndedIterator , U : DoubleEndedIterator ,
2504
2662
I :: Item : IntoIterator < IntoIter = U , Item = U :: Item >
2505
2663
{
@@ -2555,10 +2713,6 @@ impl<I, U> DoubleEndedIterator for Flatten<I, U>
2555
2713
}
2556
2714
}
2557
2715
2558
- #[ unstable( feature = "fused" , issue = "35602" ) ]
2559
- impl < I : FusedIterator , U : Iterator > FusedIterator for Flatten < I , U >
2560
- where I :: Item : IntoIterator < IntoIter = U , Item = U :: Item > { }
2561
-
2562
2716
/// An iterator that yields `None` forever after the underlying iterator
2563
2717
/// yields `None` once.
2564
2718
///
0 commit comments