use crate::types::map_builder::IntoMapBuilder;
use crate::types::Puff;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use std::collections::hash_map::{IntoIter, IntoKeys, IntoValues};
use std::collections::HashMap;
use std::hash::Hash;
use std::sync::Arc;
#[derive(Clone)]
pub struct Map<K: Clone, V: Clone>(Arc<HashMap<K, V>>);
impl<K: Serialize + Clone + Eq + Hash, V: Serialize + Clone> Serialize for Map<K, V> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
self.0.serialize(serializer)
}
}
impl<'de, K: Deserialize<'de> + Clone + Eq + Hash + Puff, V: Deserialize<'de> + Clone + Puff>
Deserialize<'de> for Map<K, V>
{
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
HashMap::deserialize(deserializer).map(|v| Map::from_hash_map(v))
}
}
impl<K, T> Map<K, T>
where
K: Puff + Hash + Eq,
T: Puff + Send + 'static,
{
pub fn new() -> Map<K, T> {
Map(Arc::new(HashMap::new()))
}
pub fn from_builder<B: IntoMapBuilder<K, T>>(builder: B) -> Map<K, T> {
builder.into_map_builder().into_map()
}
pub fn from_hash_map(hm: HashMap<K, T>) -> Map<K, T> {
Map(Arc::new(hm))
}
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
pub fn get(&self, index: K) -> Option<T> {
self.0.get(&index).map(|v| v.puff())
}
pub fn get_key_value(&self, index: K) -> Option<(K, T)> {
self.0
.get_key_value(&index)
.map(|(k, v)| (k.puff(), v.puff()))
}
pub fn len(&self) -> usize {
self.0.len()
}
pub fn iter(&self) -> IntoIter<K, T> {
let hm = HashMap::clone(&self.0);
hm.into_iter()
}
pub fn items(self) -> IntoIter<K, T> {
self.iter()
}
pub fn keys(self) -> IntoKeys<K, T> {
let hm = HashMap::clone(&self.0);
hm.into_keys()
}
pub fn values(self) -> IntoValues<K, T> {
let hm = HashMap::clone(&self.0);
hm.into_values()
}
pub fn arc_hashmap(self) -> Arc<HashMap<K, T>> {
self.0.clone()
}
}
impl<K: Puff, V: Puff> Puff for Map<K, V> {}