Skip to content

Instantly share code, notes, and snippets.

@sigmaSd
Created December 2, 2020 09:59
Show Gist options
  • Save sigmaSd/644a551f82a01e74d9badffc63bf8777 to your computer and use it in GitHub Desktop.
Save sigmaSd/644a551f82a01e74d9badffc63bf8777 to your computer and use it in GitHub Desktop.
struct UnlimitedPeekable<T, I: Iterator<Item = T>> {
iter: I,
read: Vec<T>,
}
impl<T, I: Iterator<Item = T>> UnlimitedPeekable<T, I> {
fn peek_n(&mut self, n: usize) -> Option<&T> {
// 1- indexed
if n <= self.read.len() {
self.read.get(n - 1)
} else {
while self.read.len() < n {
self.read.push(self.iter.next()?);
}
self.read.get(n - 1)
}
}
}
impl<T, I: Iterator<Item = T>> Iterator for UnlimitedPeekable<T, I> {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
if self.read.is_empty() {
self.iter.next()
} else {
Some(self.read.remove(0))
}
}
}
trait UnlimitedPeek: Iterator + Sized {
fn unlimited_peek(
self,
) -> UnlimitedPeekable<Self::Item, Self> {
UnlimitedPeekable {
iter: self,
read: vec![],
}
}
}
impl<I: Iterator> UnlimitedPeek for I {}
fn main() {
let mut s = "hello".chars().unlimited_peek();
dbg!(s.peek_n(3));
dbg!(s.next());
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment