pub trait IterExt: Iterator {
fn collect_min(self, n: usize) -> Option<Vec<Self::Item>>;
fn collect_max(self, n: usize) -> Option<Vec<Self::Item>>;
fn collect_exact(self, n: usize) -> Option<Vec<Self::Item>>;
}
impl<T: Iterator> IterExt for T {
fn collect_min(self, n: usize) -> Option<Vec<Self::Item>> {
let items: Vec<Self::Item> = self.collect();
match items.len() >= n {
true => Some(items),
false => None
}
}
fn collect_max(mut self, n: usize) -> Option<Vec<Self::Item>> {
let mut items = Vec::new();
while items.len() < n {
match self.next() {
Some(item) => items.push(item),
None => break
}
}
match self.next() {
None => Some(items),
Some(_) => None
}
}
fn collect_exact(self, n: usize) -> Option<Vec<Self::Item>> {
let items: Vec<Self::Item> = self.collect_max(n)?;
match items.len() == n {
true => Some(items),
false => None
}
}
}