use std::{
collections::VecDeque,
fmt::Display,
ops::{Shl, ShlAssign, Shr, ShrAssign},
};
use crate::{List, Set};
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Default, Hash)]
pub struct Deque<T> {
data: VecDeque<T>,
}
impl<T> Deque<T> {
pub fn new() -> Self {
Deque { data: VecDeque::new() }
}
pub fn with_capacity(capacity: usize) -> Self {
Deque {
data: VecDeque::with_capacity(capacity),
}
}
pub fn len(&self) -> usize {
self.data.len()
}
pub fn is_empty(&self) -> bool {
self.data.is_empty()
}
pub fn iter(&self) -> std::collections::vec_deque::Iter<T> {
self.data.iter()
}
pub fn back(&self) -> Option<&T> {
self.data.back()
}
pub fn front(&self) -> Option<&T> {
self.data.front()
}
pub fn back_mut(&mut self) -> Option<&mut T> {
self.data.back_mut()
}
pub fn front_mut(&mut self) -> Option<&mut T> {
self.data.front_mut()
}
pub fn push_back(&mut self, element: T) -> &Self {
self.data.push_back(element);
self
}
pub fn push_front(&mut self, element: T) -> &Self {
self.data.push_front(element);
self
}
pub fn pop_back(&mut self) -> Option<T> {
self.data.pop_back()
}
pub fn pop_front(&mut self) -> Option<T> {
self.data.pop_front()
}
pub fn clear(&mut self) {
self.data.clear()
}
pub fn reserve(&mut self, additional: usize) {
self.data.reserve(additional)
}
}
impl<T, const N: usize> From<[T; N]> for Deque<T> {
fn from(value: [T; N]) -> Self {
Self { data: VecDeque::from(value) }
}
}
impl<T> From<List<T>> for Deque<T> {
fn from(value: List<T>) -> Self {
value.into_iter().collect()
}
}
impl<T> From<Set<T>> for Deque<T> {
fn from(value: Set<T>) -> Self {
value.into_iter().collect()
}
}
impl<T> ShlAssign<usize> for Deque<T> {
fn shl_assign(&mut self, mut rhs: usize) {
if self.data.len() <= 1 || rhs == 0 {
return;
}
rhs %= self.data.len();
let mut tail = self.data.split_off(rhs);
tail.append(&mut self.data);
self.data = tail;
}
}
impl<T> ShrAssign<usize> for Deque<T> {
fn shr_assign(&mut self, mut rhs: usize) {
if self.data.len() <= 1 || rhs == 0 {
return;
}
rhs %= self.data.len();
let mut tail = self.data.split_off(self.data.len() - rhs);
tail.append(&mut self.data);
self.data = tail;
}
}
impl<T> Shl<usize> for Deque<T> {
type Output = Self;
fn shl(mut self, rhs: usize) -> Self::Output {
self <<= rhs;
self
}
}
impl<T> Shr<usize> for Deque<T> {
type Output = Self;
fn shr(mut self, rhs: usize) -> Self::Output {
self >>= rhs;
self
}
}
impl<T: Display> Display for Deque<T> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
if self.data.is_empty() {
return write!(f, "<>");
}
let mut it = self.data.iter().peekable();
write!(f, "<")?;
loop {
write!(f, "{}", it.next().unwrap())?;
if it.peek().is_none() {
return write!(f, ">");
}
write!(f, ", ")?;
}
}
}
impl<T> FromIterator<T> for Deque<T> {
fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
let data = iter.into_iter().collect();
Self { data }
}
}
impl<T> IntoIterator for Deque<T> {
type Item = T;
type IntoIter = std::collections::vec_deque::IntoIter<T>;
fn into_iter(self) -> Self::IntoIter {
self.data.into_iter()
}
}
impl<T> From<VecDeque<T>> for Deque<T> {
fn from(value: VecDeque<T>) -> Self {
Self { data: value }
}
}
impl<T> From<Deque<T>> for VecDeque<T> {
fn from(value: Deque<T>) -> Self {
value.data
}
}