summaryrefslogtreecommitdiffstats
path: root/library/core/src/iter/adapters/cycle.rs
diff options
context:
space:
mode:
Diffstat (limited to 'library/core/src/iter/adapters/cycle.rs')
-rw-r--r--library/core/src/iter/adapters/cycle.rs26
1 files changed, 13 insertions, 13 deletions
diff --git a/library/core/src/iter/adapters/cycle.rs b/library/core/src/iter/adapters/cycle.rs
index 02b593907..51bd09b6e 100644
--- a/library/core/src/iter/adapters/cycle.rs
+++ b/library/core/src/iter/adapters/cycle.rs
@@ -1,3 +1,4 @@
+use crate::num::NonZeroUsize;
use crate::{iter::FusedIterator, ops::Try};
/// An iterator that repeats endlessly.
@@ -81,23 +82,22 @@ where
#[inline]
#[rustc_inherit_overflow_checks]
- fn advance_by(&mut self, n: usize) -> Result<(), usize> {
- let mut rem = n;
- match self.iter.advance_by(rem) {
- ret @ Ok(_) => return ret,
- Err(advanced) => rem -= advanced,
- }
+ fn advance_by(&mut self, n: usize) -> Result<(), NonZeroUsize> {
+ let mut n = match self.iter.advance_by(n) {
+ Ok(()) => return Ok(()),
+ Err(rem) => rem.get(),
+ };
- while rem > 0 {
+ while n > 0 {
self.iter = self.orig.clone();
- match self.iter.advance_by(rem) {
- ret @ Ok(_) => return ret,
- Err(0) => return Err(n - rem),
- Err(advanced) => rem -= advanced,
- }
+ n = match self.iter.advance_by(n) {
+ Ok(()) => return Ok(()),
+ e @ Err(rem) if rem.get() == n => return e,
+ Err(rem) => rem.get(),
+ };
}
- Ok(())
+ NonZeroUsize::new(n).map_or(Ok(()), Err)
}
// No `fold` override, because `fold` doesn't make much sense for `Cycle`,