use std::{
collections::{HashSet, VecDeque},
hash::Hash,
};
#[derive(Debug)]
pub struct BfsQueue<T> {
queue: VecDeque<T>,
set: HashSet<T>,
}
#[allow(dead_code)]
impl<T: Eq + Hash + Clone> BfsQueue<T> {
pub fn new() -> Self {
BfsQueue {
queue: VecDeque::new(),
set: HashSet::new(),
}
}
pub fn with_capacity(capacity: usize) -> Self {
BfsQueue {
queue: VecDeque::with_capacity(capacity),
set: HashSet::with_capacity(capacity),
}
}
pub fn push(&mut self, element: T) -> bool {
if self.set.insert(element.clone()) {
self.queue.push_back(element);
true
} else {
false
}
}
pub fn push_all(&mut self, iter: impl IntoIterator<Item = T>) {
for x in iter {
self.push(x);
}
}
pub fn is_empty(&self) -> bool {
self.queue.is_empty()
}
pub fn len(&self) -> usize {
self.queue.len()
}
pub fn pop(&mut self) -> Option<T> {
self.queue.pop_front()
}
}