use std::collections::VecDeque;
use crate::{AsMutSlice, LinearMap};
pub struct VecDequeMap<K: Eq, V: Sized + PartialEq> {
vecdeque: VecDeque<(K, V)>,
}
impl<K: Eq, V: Sized + PartialEq> VecDequeMap<K, V> {
pub fn new() -> VecDequeMap<K, V> {
VecDequeMap {
vecdeque: VecDeque::new(),
}
}
pub const unsafe fn from_vecdeque_unchecked(vecdeque: VecDeque<(K, V)>) -> VecDequeMap<K, V> {
VecDequeMap { vecdeque }
}
pub fn with_capacity(capacity: usize) -> VecDequeMap<K, V> {
VecDequeMap {
vecdeque: VecDeque::with_capacity(capacity),
}
}
pub fn remove(&mut self, key: &K) -> Option<V> {
self.remove_entry(key).map(|(_, v)| v)
}
pub fn remove_entry(&mut self, key: &K) -> Option<(K, V)> {
let idx = self
.vecdeque
.iter()
.enumerate()
.find(|(_, (k, _))| k == key)
.map(|(i, _)| i)?;
self.vecdeque.remove(idx)
}
pub fn insert(&mut self, key: K, value: V) -> Option<V> {
match self.vecdeque.iter_mut().find(|(k, _)| *k == key) {
Some((_, v)) => Some(std::mem::replace(v, value)),
None => {
self.vecdeque.push_back((key, value));
None
}
}
}
}
impl<K: Eq, V: Sized + PartialEq> LinearMap<K, V> for VecDequeMap<K, V> {
type Backing = VecDeque<(K, V)>;
fn as_slice(&self) -> &[(K, V)] {
[self.vecdeque.as_slices()].concat()
}
fn into_inner(self) -> Self::Backing {
self.vecdeque
}
}
impl<K: Eq, V: Sized + PartialEq> AsMutSlice<K, V> for VecDequeMap<K, V> {
fn as_mut_slice(&mut self) -> &mut [(K, V)] {
[self.vecdeque.as_mut_slices()].concat()
}
}