Sha256: 834f6ef7fdf9f00c8a6329beb38eaefb706847ceeec309c221dce705c2c1e05b
Contents?: true
Size: 1.23 KB
Versions: 25
Compression:
Stored size: 1.23 KB
Contents
use std::ops::Index; use alloc::vec::Vec; #[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> { LazyBuffer { it, done: false, buffer: Vec::new(), } } pub fn len(&self) -> usize { self.buffer.len() } pub fn get_next(&mut self) -> bool { if self.done { return false; } if let Some(x) = self.it.next() { self.buffer.push(x); true } else { self.done = true; false } } pub fn prefill(&mut self, len: usize) { let buffer_len = self.buffer.len(); if !self.done && len > buffer_len { let delta = len - buffer_len; self.buffer.extend(self.it.by_ref().take(delta)); self.done = self.buffer.len() < len; } } } 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) } }
Version data entries
25 entries across 25 versions & 1 rubygems