1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
use std::ops::Index; #[derive(Debug, Clone)] pub struct LazyBuffer<I: Iterator> { pub it: I, done: bool, buffer: Vec<I::Item>, } impl<I> LazyBuffer<I> where I: Iterator, { pub fn new(it: I) -> LazyBuffer<I> { let mut it = it; let mut buffer = Vec::new(); let done; if let Some(first) = it.next() { buffer.push(first); done = false; } else { done = true; } LazyBuffer { it: it, done: done, buffer: buffer, } } 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<I, J> Index<J> for LazyBuffer<I> where I: Iterator, I::Item: Sized, Vec<I::Item>: Index<J> { type Output = <Vec<I::Item> as Index<J>>::Output; fn index(&self, _index: J) -> &Self::Output { self.buffer.index(_index) } }