Skip to content

Instantly share code, notes, and snippets.

@kevincox
Created July 16, 2017 14:23
Show Gist options
  • Save kevincox/019a0a4d1024e5bddd4be1cbe88fb2bc to your computer and use it in GitHub Desktop.
Save kevincox/019a0a4d1024e5bddd4be1cbe88fb2bc to your computer and use it in GitHub Desktop.
Rust Buffered Iterator
extern crate std;
pub struct BufferedIterator<Iter: Iterator> {
iter: Iter,
buffer: Vec<Iter::Item>,
}
impl<Iter: Iterator> BufferedIterator<Iter> {
pub fn new(iter: Iter) -> Self {
BufferedIterator{
iter: iter,
buffer: Vec::new(),
}
}
pub fn peek(&mut self) -> Option<&Iter::Item> {
if self.buffer.is_empty() {
if let Some(e) = self.iter.next() {
self.buffer.push(e)
}
}
self.buffer.last()
}
pub fn unget(&mut self, e: Iter::Item) {
self.buffer.insert(0, e)
}
}
impl<Iter: Iterator> Iterator for BufferedIterator<Iter> {
type Item = Iter::Item;
fn next(&mut self) -> Option<Self::Item> {
self.buffer.pop().or_else(|| self.iter.next())
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment