Implement iter::Chain::{advance_by, advance_back_by}
This commit is contained in:
parent
9cba260df0
commit
c5d6a0dd96
|
@ -115,16 +115,42 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn nth(&mut self, mut n: usize) -> Option<A::Item> {
|
fn advance_by(&mut self, n: usize) -> Result<(), usize> {
|
||||||
|
let mut rem = n;
|
||||||
|
|
||||||
if let Some(ref mut a) = self.a {
|
if let Some(ref mut a) = self.a {
|
||||||
while let Some(x) = a.next() {
|
match a.advance_by(rem) {
|
||||||
if n == 0 {
|
Ok(()) => return Ok(()),
|
||||||
return Some(x);
|
Err(k) => rem -= k,
|
||||||
}
|
|
||||||
n -= 1;
|
|
||||||
}
|
}
|
||||||
self.a = None;
|
self.a = None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let Some(ref mut b) = self.b {
|
||||||
|
match b.advance_by(rem) {
|
||||||
|
Ok(()) => return Ok(()),
|
||||||
|
Err(k) => rem -= k,
|
||||||
|
}
|
||||||
|
// we don't fuse the second iterator
|
||||||
|
}
|
||||||
|
|
||||||
|
if rem == 0 { Ok(()) } else { Err(n - rem) }
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn nth(&mut self, mut n: usize) -> Option<Self::Item> {
|
||||||
|
if let Some(ref mut a) = self.a {
|
||||||
|
match a.advance_by(n) {
|
||||||
|
Ok(()) => match a.next() {
|
||||||
|
None => n = 0,
|
||||||
|
x => return x,
|
||||||
|
},
|
||||||
|
Err(k) => n -= k,
|
||||||
|
}
|
||||||
|
|
||||||
|
self.a = None;
|
||||||
|
}
|
||||||
|
|
||||||
maybe!(self.b.nth(n))
|
maybe!(self.b.nth(n))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -191,16 +217,42 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn nth_back(&mut self, mut n: usize) -> Option<A::Item> {
|
fn advance_back_by(&mut self, n: usize) -> Result<(), usize> {
|
||||||
|
let mut rem = n;
|
||||||
|
|
||||||
if let Some(ref mut b) = self.b {
|
if let Some(ref mut b) = self.b {
|
||||||
while let Some(x) = b.next_back() {
|
match b.advance_back_by(rem) {
|
||||||
if n == 0 {
|
Ok(()) => return Ok(()),
|
||||||
return Some(x);
|
Err(k) => rem -= k,
|
||||||
}
|
|
||||||
n -= 1;
|
|
||||||
}
|
}
|
||||||
self.b = None;
|
self.b = None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let Some(ref mut a) = self.a {
|
||||||
|
match a.advance_back_by(rem) {
|
||||||
|
Ok(()) => return Ok(()),
|
||||||
|
Err(k) => rem -= k,
|
||||||
|
}
|
||||||
|
// we don't fuse the second iterator
|
||||||
|
}
|
||||||
|
|
||||||
|
if rem == 0 { Ok(()) } else { Err(n - rem) }
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn nth_back(&mut self, mut n: usize) -> Option<Self::Item> {
|
||||||
|
if let Some(ref mut b) = self.b {
|
||||||
|
match b.advance_back_by(n) {
|
||||||
|
Ok(()) => match b.next_back() {
|
||||||
|
None => n = 0,
|
||||||
|
x => return x,
|
||||||
|
},
|
||||||
|
Err(k) => n -= k,
|
||||||
|
}
|
||||||
|
|
||||||
|
self.b = None;
|
||||||
|
}
|
||||||
|
|
||||||
maybe!(self.a.nth_back(n))
|
maybe!(self.a.nth_back(n))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue