use alloc::vec::Vec; use crate::size_hint; /// An iterator adaptor that allows putting multiple /// items in front of the iterator. /// /// Iterator element type is `I::Item`. #[derive(Debug, Clone)] pub struct PutBackN { top: Vec, iter: I, } /// Create an iterator where you can put back multiple values to the front /// of the iteration. /// /// Iterator element type is `I::Item`. pub fn put_back_n(iterable: I) -> PutBackN where I: IntoIterator { PutBackN { top: Vec::new(), iter: iterable.into_iter(), } } impl PutBackN { /// Puts x in front of the iterator. /// The values are yielded in order of the most recently put back /// values first. /// /// ```rust /// use itertools::put_back_n; /// /// let mut it = put_back_n(1..5); /// it.next(); /// it.put_back(1); /// it.put_back(0); /// /// assert!(itertools::equal(it, 0..5)); /// ``` #[inline] pub fn put_back(&mut self, x: I::Item) { self.top.push(x); } } impl Iterator for PutBackN { type Item = I::Item; #[inline] fn next(&mut self) -> Option { self.top.pop().or_else(|| self.iter.next()) } #[inline] fn size_hint(&self) -> (usize, Option) { size_hint::add_scalar(self.iter.size_hint(), self.top.len()) } }