minify/io/
multi_filter.rs1use 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}