rspack_util/
queue.rs

1use std::{collections::VecDeque, hash::Hash};
2
3use rustc_hash::FxHashSet as HashSet;
4
5pub struct Queue<T: Hash + PartialEq + Eq + Clone> {
6  q: VecDeque<T>,
7  set: HashSet<T>,
8}
9
10impl<T: Hash + PartialEq + Eq + Clone> Default for Queue<T> {
11  fn default() -> Self {
12    Self::new()
13  }
14}
15
16impl<T: Hash + PartialEq + Eq + Clone> Queue<T> {
17  pub fn new() -> Self {
18    Self {
19      q: VecDeque::default(),
20      set: HashSet::default(),
21    }
22  }
23
24  pub fn enqueue(&mut self, item: T) {
25    if !self.set.contains(&item) {
26      self.q.push_back(item.clone());
27      self.set.insert(item);
28    }
29  }
30
31  pub fn is_empty(&self) -> bool {
32    self.q.is_empty()
33  }
34
35  pub fn dequeue(&mut self) -> Option<T> {
36    if let Some(item) = self.q.pop_front() {
37      self.set.remove(&item);
38      return Some(item);
39    }
40    None
41  }
42}