output_iter/iterators/
ignore_output.rs1use crate::{IterVariant, OutputIterator, OutputIteratorVariant};
2
3pub 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}