@@ -427,6 +427,62 @@ pub trait DoubleEndedIterator: Iterator {
427
427
#[stable(feature = "rust1", since = "1.0.0")]
428
428
fn next_back(&mut self) -> Option<Self::Item>;
429
429
430
+ /// Returns the `n`th element from the end of the iterator.
431
+ ///
432
+ /// This is essentially the reversed version of [`nth`]. Although like most indexing
433
+ /// operations, the count starts from zero, so `nth_back(0)` returns the first value fro
434
+ /// the end, `nth_back(1)` the second, and so on.
435
+ ///
436
+ /// Note that all elements between the end and the returned element will be
437
+ /// consumed, including the returned element. This also means that calling
438
+ /// `nth_back(0)` multiple times on the same iterator will return different
439
+ /// elements.
440
+ ///
441
+ /// `nth_back()` will return [`None`] if `n` is greater than or equal to the length of the
442
+ /// iterator.
443
+ ///
444
+ /// [`None`]: ../../std/option/enum.Option.html#variant.None
445
+ /// [`nth`]: ../../std/iter/trait.Iterator.html#method.nth
446
+ ///
447
+ /// # Examples
448
+ ///
449
+ /// Basic usage:
450
+ ///
451
+ /// ```
452
+ /// #![feature(iter_nth_back)]
453
+ /// let a = [1, 2, 3];
454
+ /// assert_eq!(a.iter().nth_back(2), Some(&1));
455
+ /// ```
456
+ ///
457
+ /// Calling `nth_back()` multiple times doesn't rewind the iterator:
458
+ ///
459
+ /// ```
460
+ /// #![feature(iter_nth_back)]
461
+ /// let a = [1, 2, 3];
462
+ ///
463
+ /// let mut iter = a.iter();
464
+ ///
465
+ /// assert_eq!(iter.nth_back(1), Some(&2));
466
+ /// assert_eq!(iter.nth_back(1), None);
467
+ /// ```
468
+ ///
469
+ /// Returning `None` if there are less than `n + 1` elements:
470
+ ///
471
+ /// ```
472
+ /// #![feature(iter_nth_back)]
473
+ /// let a = [1, 2, 3];
474
+ /// assert_eq!(a.iter().nth_back(10), None);
475
+ /// ```
476
+ #[inline]
477
+ #[unstable(feature = "iter_nth_back", issue = "56995")]
478
+ fn nth_back(&mut self, mut n: usize) -> Option<Self::Item> {
479
+ for x in self.rev() {
480
+ if n == 0 { return Some(x) }
481
+ n -= 1;
482
+ }
483
+ None
484
+ }
485
+
430
486
/// This is the reverse version of [`try_fold()`]: it takes elements
431
487
/// starting from the back of the iterator.
432
488
///
@@ -461,8 +517,11 @@ pub trait DoubleEndedIterator: Iterator {
461
517
/// ```
462
518
#[inline]
463
519
#[stable(feature = "iterator_try_fold", since = "1.27.0")]
464
- fn try_rfold<B, F, R>(&mut self, init: B, mut f: F) -> R where
465
- Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try<Ok=B>
520
+ fn try_rfold<B, F, R>(&mut self, init: B, mut f: F) -> R
521
+ where
522
+ Self: Sized,
523
+ F: FnMut(B, Self::Item) -> R,
524
+ R: Try<Ok=B>
466
525
{
467
526
let mut accum = init;
468
527
while let Some(x) = self.next_back() {
@@ -524,8 +583,10 @@ pub trait DoubleEndedIterator: Iterator {
524
583
/// ```
525
584
#[inline]
526
585
#[stable(feature = "iter_rfold", since = "1.27.0")]
527
- fn rfold<B, F>(mut self, accum: B, mut f: F) -> B where
528
- Self: Sized, F: FnMut(B, Self::Item) -> B,
586
+ fn rfold<B, F>(mut self, accum: B, mut f: F) -> B
587
+ where
588
+ Self: Sized,
589
+ F: FnMut(B, Self::Item) -> B,
529
590
{
530
591
self.try_rfold(accum, move |acc, x| Ok::<B, !>(f(acc, x))).unwrap()
531
592
}
@@ -574,7 +635,8 @@ pub trait DoubleEndedIterator: Iterator {
574
635
/// ```
575
636
#[inline]
576
637
#[stable(feature = "iter_rfind", since = "1.27.0")]
577
- fn rfind<P>(&mut self, mut predicate: P) -> Option<Self::Item> where
638
+ fn rfind<P>(&mut self, mut predicate: P) -> Option<Self::Item>
639
+ where
578
640
Self: Sized,
579
641
P: FnMut(&Self::Item) -> bool
580
642
{
@@ -587,7 +649,12 @@ pub trait DoubleEndedIterator: Iterator {
587
649
588
650
#[stable(feature = "rust1", since = "1.0.0")]
589
651
impl<'a, I: DoubleEndedIterator + ?Sized> DoubleEndedIterator for &'a mut I {
590
- fn next_back(&mut self) -> Option<I::Item> { (**self).next_back() }
652
+ fn next_back(&mut self) -> Option<I::Item> {
653
+ (**self).next_back()
654
+ }
655
+ fn nth_back(&mut self, n: usize) -> Option<I::Item> {
656
+ (**self).nth_back(n)
657
+ }
591
658
}
592
659
593
660
/// An iterator that knows its exact length.
0 commit comments