swc_css_minifier/
util.rs

1use std::mem::take;
2
3use swc_common::EqIgnoreSpan;
4
5pub(crate) fn dedup<T>(v: &mut Vec<T>)
6where
7    T: EqIgnoreSpan,
8{
9    let mut remove_list = Vec::new();
10
11    for (i, i1) in v.iter().enumerate() {
12        for (j, j1) in v.iter().enumerate() {
13            if i < j && i1.eq_ignore_span(j1) {
14                remove_list.push(j);
15            }
16        }
17    }
18
19    // Fast path. We don't face real duplicates in most cases.
20    if remove_list.is_empty() {
21        return;
22    }
23
24    let new = take(v)
25        .into_iter()
26        .enumerate()
27        .filter_map(|(idx, value)| {
28            if remove_list.contains(&idx) {
29                None
30            } else {
31                Some(value)
32            }
33        })
34        .collect::<Vec<_>>();
35
36    *v = new;
37}