implement nth_back for Range
This commit is contained in:
@@ -281,6 +281,19 @@ impl<A: Step> DoubleEndedIterator for ops::Range<A> {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn nth_back(&mut self, n: usize) -> Option<A> {
|
||||
if let Some(minus_n) = self.end.sub_usize(n) {
|
||||
if minus_n > self.start {
|
||||
self.end = minus_n.sub_one();
|
||||
return Some(self.end.clone())
|
||||
}
|
||||
}
|
||||
|
||||
self.end = self.start.clone();
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "fused", since = "1.26.0")]
|
||||
|
||||
@@ -1657,6 +1657,23 @@ fn test_range_nth() {
|
||||
assert_eq!(r, 20..20);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_range_nth_back() {
|
||||
assert_eq!((10..15).nth_back(0), Some(14));
|
||||
assert_eq!((10..15).nth_back(1), Some(13));
|
||||
assert_eq!((10..15).nth_back(4), Some(10));
|
||||
assert_eq!((10..15).nth_back(5), None);
|
||||
assert_eq!((-120..80_i8).nth_back(199), Some(-120));
|
||||
|
||||
let mut r = 10..20;
|
||||
assert_eq!(r.nth_back(2), Some(17));
|
||||
assert_eq!(r, 10..17);
|
||||
assert_eq!(r.nth_back(2), Some(14));
|
||||
assert_eq!(r, 10..14);
|
||||
assert_eq!(r.nth_back(10), None);
|
||||
assert_eq!(r, 10..10);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_range_from_nth() {
|
||||
assert_eq!((10..).nth(0), Some(10));
|
||||
|
||||
Reference in New Issue
Block a user