use std::sync::{Arc, Mutex};
#[derive(Debug, Clone)]
pub struct Queue<T> {
queue: Arc<Mutex<Vec<T>>>, }
impl<T> Queue<T> {
pub fn new() -> Self {
Queue {
queue: Arc::new(Mutex::new(Vec::new())), }
}
pub fn length(&self) -> usize {
let queue = self.queue.lock().unwrap(); queue.len()
}
pub fn enqueue(&self, item: T) {
let mut queue = self.queue.lock().unwrap(); queue.push(item);
}
pub fn dequeue(&self) -> Option<T> {
let mut queue = self.queue.lock().unwrap(); if !queue.is_empty() {
Some(queue.remove(0)) } else {
None }
}
pub fn is_empty(&self) -> bool {
let queue = self.queue.lock().unwrap(); queue.is_empty()
}
pub fn peek(&self) -> Option<T>
where
T: Clone, {
let queue = self.queue.lock().unwrap(); queue.first().cloned() }
pub fn iter(&self) -> Vec<T>
where
T: Clone, {
let queue = self.queue.lock().unwrap();
queue.clone() }
}