use std::borrow::Cow;
use super::*;
pub struct AvanceIter<Iter> {
pub(crate) iter: Iter,
pub(crate) bar: AvanceBar,
}
pub trait AvanceIterator
where
Self: Sized + Iterator,
{
fn avance(self) -> AvanceIter<Self> {
AvanceIter {
bar: AvanceBar::with_hint(self.size_hint().1),
iter: self,
}
}
}
impl<Iter: Iterator> AvanceIter<Iter> {
pub fn with_style(self, style: Style) -> Self {
self.bar.set_style(style);
self
}
pub fn with_style_str(self, s: &'static str) -> Self {
self.bar.set_style_str(s);
self
}
pub fn with_desc(self, desc: impl Into<Cow<'static, str>>) -> Self {
self.bar.set_desc(desc);
self
}
pub fn with_unit_scale(self, unit_scale: bool) -> Self {
self.bar.set_unit_scale(unit_scale);
self
}
pub fn with_width(self, width: u16) -> Self {
self.bar.set_width(width);
self
}
pub fn with_pb(self) -> AvanceBarIter<Iter> {
AvanceBarIter(self)
}
}
impl<Iter: Iterator> AvanceIterator for Iter {}
impl<Iter: Iterator> Iterator for AvanceIter<Iter> {
type Item = Iter::Item;
fn next(&mut self) -> Option<Self::Item> {
if let Some(next) = self.iter.next() {
self.bar.inc();
Some(next)
} else {
None
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.iter.size_hint()
}
}
impl<Iter: ExactSizeIterator> ExactSizeIterator for AvanceIter<Iter> {
fn len(&self) -> usize {
self.iter.len()
}
}
impl<Iter: DoubleEndedIterator> DoubleEndedIterator for AvanceIter<Iter> {
fn next_back(&mut self) -> Option<Self::Item> {
if let Some(next) = self.iter.next_back() {
self.bar.inc();
Some(next)
} else {
None
}
}
}
pub struct AvanceBarIter<Iter>(AvanceIter<Iter>);
impl<Iter: Iterator> Iterator for AvanceBarIter<Iter> {
type Item = (Iter::Item, AvanceBar);
fn next(&mut self) -> Option<Self::Item> {
self.0.next().map(|item| (item, self.0.bar.clone()))
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.0.size_hint()
}
}
impl<Iter: ExactSizeIterator> ExactSizeIterator for AvanceBarIter<Iter> {
fn len(&self) -> usize {
self.0.len()
}
}
impl<Iter: DoubleEndedIterator> DoubleEndedIterator for AvanceBarIter<Iter> {
fn next_back(&mut self) -> Option<Self::Item> {
self.0.next_back().map(|item| (item, self.0.bar.clone()))
}
}