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}