use std::collections::VecDeque;
pub struct Queue<T> {
data: VecDeque<T>,
}
impl<T> Queue<T> {
pub fn new() -> Self {
Queue {
data: VecDeque::new(),
}
}
pub fn enqueue(&mut self, item: T) {
self.data.push_back(item);
}
pub fn dequeue(&mut self) -> Option<T> {
self.data.pop_front()
}
pub fn size(&self) -> usize {
self.data.len()
}
pub fn peek(&self) -> Option<&T> {
self.data.front()
}
}
impl<T> Default for Queue<T> {
fn default() -> Self {
Self::new()
}
}
impl <T> Iterator for Queue<T> {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
self.dequeue()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn create_queue() {
let queue: Queue<i32> = Queue::new();
assert_eq!(queue.data.len(), 0);
}
#[test]
fn enqueue_to_queue() {
let mut queue = Queue::new();
queue.enqueue(1);
assert_eq!(queue.data.len(), 1);
}
#[test]
fn dequeue_from_queue() {
let mut queue = Queue::new();
queue.enqueue(1);
queue.enqueue(2);
assert_eq!(queue.data.len(), 2);
assert_eq!(queue.dequeue(), Some(1));
assert_eq!(queue.dequeue(), Some(2));
assert_eq!(queue.dequeue(), None);
assert_eq!(queue.dequeue(), None);
}
#[test]
fn peek_from_queue() {
let mut queue = Queue::new();
queue.enqueue(1);
queue.enqueue(2);
assert_eq!(queue.data.len(), 2);
assert_eq!(queue.peek(), Some(&1));
}
#[test]
fn iterate_queue() {
let mut queue = Queue::new();
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
let mut iter = queue.into_iter();
assert_eq!(iter.next(), Some(1));
assert_eq!(iter.next(), Some(2));
assert_eq!(iter.next(), Some(3));
assert_eq!(iter.next(), None);
assert_eq!(iter.next(), None);
}
#[test]
fn get_queue_size_when_has_items() {
let mut queue = Queue::new();
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
assert_eq!(queue.size(), 3);
}
#[test]
fn get_queue_size_when_is_empty() {
let queue: Queue<i32> = Queue::new();
assert_eq!(queue.size(), 0);
}
}