minify/io/
multi_filter.rs

1use std::{fmt, mem};
2
3pub struct MultiFilter<I: Iterator, P, M> {
4    minifier: M,
5    iter: I,
6    predicate: P,
7    initialized: bool,
8    item1: Option<I::Item>,
9    item2: Option<I::Item>,
10    item3: Option<I::Item>,
11    item4: Option<I::Item>,
12    item5: Option<I::Item>,
13}
14
15impl<I: Iterator, P, M: Default> MultiFilter<I, P, M> {
16    #[inline]
17    pub fn new(iter: I, predicate: P) -> Self {
18        Self {
19            minifier: M::default(),
20            iter,
21            predicate,
22            initialized: false,
23            item1: None,
24            item2: None,
25            item3: None,
26            item4: None,
27            item5: None,
28        }
29    }
30}
31
32impl<I: Iterator + fmt::Debug, P, M> fmt::Debug for MultiFilter<I, P, M> {
33    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
34        f.debug_struct("Filter")
35            .field("iter", &self.iter)
36            .field("initialized", &self.initialized)
37            .finish()
38    }
39}
40
41impl<I, It, P, M> Iterator for MultiFilter<I, P, M>
42where
43    I: Iterator<Item = It>,
44    It: Copy,
45    P: FnMut(
46        &mut M,
47        I::Item,
48        Option<I::Item>,
49        Option<I::Item>,
50        Option<I::Item>,
51        Option<I::Item>,
52        Option<I::Item>,
53    ) -> bool,
54{
55    type Item = I::Item;
56
57    #[inline]
58    fn next(&mut self) -> Option<I::Item> {
59        if !self.initialized {
60            self.item1 = self.iter.next();
61            self.item2 = self.iter.next();
62            self.item3 = self.iter.next();
63            self.item4 = self.iter.next();
64            self.item5 = self.iter.next();
65            self.initialized = true;
66        }
67
68        while let Some(item) = self.item1.take() {
69            mem::swap(&mut self.item1, &mut self.item2);
70            mem::swap(&mut self.item2, &mut self.item3);
71            mem::swap(&mut self.item3, &mut self.item4);
72            mem::swap(&mut self.item4, &mut self.item5);
73            self.item5 = self.iter.next();
74
75            if (self.predicate)(
76                &mut self.minifier,
77                item,
78                self.item1,
79                self.item2,
80                self.item3,
81                self.item4,
82                self.item5,
83            ) {
84                return Some(item);
85            }
86        }
87        None
88    }
89}