output_iter/iterators/
ignore_output.rs

1use crate::{IterVariant, OutputIterator, OutputIteratorVariant};
2
3/// An iterator that ignores the intermediate output of an [`OutputIterator`].
4pub struct IgnoreOutput<T: OutputIterator> {
5    iter: Option<IterVariant<T>>,
6}
7
8impl<T: OutputIterator> IgnoreOutput<T> {
9    pub(crate) fn new(iter: T) -> Self {
10        IgnoreOutput {
11            iter: Some(IterVariant::Before(iter)),
12        }
13    }
14}
15
16impl<T: OutputIterator> Iterator for IgnoreOutput<T> {
17    type Item = T::Item;
18
19    fn next(&mut self) -> Option<Self::Item> {
20        use IterVariant::*;
21        use OutputIteratorVariant::*;
22
23        let Some(current_iter) = self.iter.take() else {
24            panic!("Called `next` on iterator over `OutputIterator` that previously panicked");
25        };
26
27        let result;
28        let next_iter;
29
30        (result, next_iter) = match current_iter {
31            Before(iter) => match iter.next() {
32                Next(next_iter, item) => (Some(item), Before(next_iter)),
33                Output(mut next_iter, _) => (next_iter.next(), After(next_iter)),
34            },
35
36            After(mut iter) => (iter.next(), After(iter)),
37        };
38
39        self.iter = Some(next_iter);
40        result
41    }
42}