diff --git a/library/core/src/iter/adapters/peekable.rs b/library/core/src/iter/adapters/peekable.rs index cc12cd9c35601..966d05e164c65 100644 --- a/library/core/src/iter/adapters/peekable.rs +++ b/library/core/src/iter/adapters/peekable.rs @@ -7,6 +7,29 @@ use crate::ops::{ControlFlow, Try}; /// /// This `struct` is created by the [`peekable`] method on [`Iterator`]. See its /// documentation for more. +/// +/// `Peakable` has an implementation: `impl From> for I`, use `I::from()` can get back to [`Iterator`]. +/// ```rust +/// struct Counter { +/// v: usize, +/// } +/// +/// impl Iterator for Counter { +/// type Item = usize; +/// +/// fn next(&mut self) -> Option { +/// let v = self.v; +/// self.v += 1; +/// Some(v) +/// } +/// } +/// +/// let counter = Counter { v: 0 }; +/// let mut peekable = counter.peekable(); +/// assert_eq!(peekable.peek(), Some(&0)); +/// let counter = Counter::from(peekable); +/// assert_eq!(counter.next(), Some(0)); +/// ``` /// /// [`peekable`]: Iterator::peekable /// [`Iterator`]: trait.Iterator.html @@ -26,6 +49,12 @@ impl Peekable { } } +impl From> for I { + fn from(p: Peekable) -> Self { + p.iter + } +} + // Peekable must remember if a None has been seen in the `.peek()` method. // It ensures that `.peek(); .peek();` or `.peek(); .next();` only advances the // underlying iterator at most once. This does not by itself make the iterator