use std::ops::Index; #[derive(Debug, Clone)] pub struct LazyBuffer { pub it: I, done: bool, buffer: Vec, } impl LazyBuffer where I: Iterator, { pub fn new(it: I) -> LazyBuffer { LazyBuffer { it, done: false, buffer: Vec::new(), } } pub fn len(&self) -> usize { self.buffer.len() } pub fn is_done(&self) -> bool { self.done } pub fn get_next(&mut self) -> bool { if self.done { return false; } let next_item = self.it.next(); match next_item { Some(x) => { self.buffer.push(x); true } None => { self.done = true; false } } } } impl Index for LazyBuffer where I: Iterator, I::Item: Sized, Vec: Index { type Output = as Index>::Output; fn index(&self, _index: J) -> &Self::Output { self.buffer.index(_index) } }