use std::vec::Vec;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(
feature = "serde",
serde(bound(
serialize = "K: Serialize + Eq, V: Serialize",
deserialize = "K: Deserialize<'de> + Eq, V: Deserialize<'de>"
))
)]
pub struct NeoMap<K, V> {
data: Vec<(K, V)>,
}
impl<K, V> NeoMap<K, V> {
pub fn new() -> Self {
Self { data: Vec::new() }
}
pub fn insert(&mut self, key: K, value: V) -> Option<V>
where
K: PartialEq,
{
for (k, v) in &mut self.data {
if *k == key {
return Some(core::mem::replace(v, value));
}
}
self.data.push((key, value));
None
}
pub fn get(&self, key: &K) -> Option<&V>
where
K: PartialEq,
{
self.data.iter().find(|(k, _)| k == key).map(|(_, v)| v)
}
pub fn get_mut(&mut self, key: &K) -> Option<&mut V>
where
K: PartialEq,
{
self.data.iter_mut().find(|(k, _)| k == key).map(|(_, v)| v)
}
pub fn remove(&mut self, key: &K) -> Option<V>
where
K: PartialEq,
{
self.data
.iter()
.position(|(k, _)| k == key)
.map(|i| self.data.swap_remove(i).1)
}
pub fn len(&self) -> usize {
self.data.len()
}
pub fn is_empty(&self) -> bool {
self.data.is_empty()
}
pub fn iter(&self) -> impl Iterator<Item = (&K, &V)> {
self.data.iter().map(|(k, v)| (k, v))
}
pub fn contains_key(&self, key: &K) -> bool
where
K: PartialEq,
{
self.data.iter().any(|(k, _)| k == key)
}
pub fn keys(&self) -> impl Iterator<Item = &K> {
self.data.iter().map(|(k, _)| k)
}
pub fn values(&self) -> impl Iterator<Item = &V> {
self.data.iter().map(|(_, v)| v)
}
}
impl<K, V> Default for NeoMap<K, V> {
fn default() -> Self {
Self::new()
}
}
impl<K, V> IntoIterator for NeoMap<K, V> {
type Item = (K, V);
type IntoIter = std::vec::IntoIter<(K, V)>;
fn into_iter(self) -> Self::IntoIter {
self.data.into_iter()
}
}
impl<'a, K, V> IntoIterator for &'a NeoMap<K, V> {
type Item = &'a (K, V);
type IntoIter = std::slice::Iter<'a, (K, V)>;
fn into_iter(self) -> Self::IntoIter {
self.data.iter()
}
}