use crate::types::{Map, Puff};
use std::collections::HashMap;
use std::hash::Hash;
#[derive(Clone)]
pub struct MapBuilder<K, V>(HashMap<K, V>);
impl<K, T> MapBuilder<K, T>
where
K: Puff + Hash + Eq,
T: Puff,
{
pub fn new() -> MapBuilder<K, T> {
Self(HashMap::new())
}
pub fn with_capacity(capacity: usize) -> MapBuilder<K, T> {
Self(HashMap::with_capacity(capacity))
}
#[inline]
pub fn insert(&mut self, key: K, item: T) -> Option<T> {
self.0.insert(key, item)
}
#[inline]
pub fn get(&self, index: K) -> Option<T> {
self.0.get(&index).map(|v| v.clone())
}
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
pub fn len(&self) -> usize {
self.0.len()
}
pub fn into_map(self) -> Map<K, T> {
Map::from_hash_map(self.0)
}
}
pub trait IntoMapBuilder<K, V> {
fn into_map_builder(self) -> MapBuilder<K, V>;
}
impl<T: Into<MapBuilder<K, V>>, K: Puff + Hash + Eq, V: Puff> IntoMapBuilder<K, V> for T {
fn into_map_builder(self) -> MapBuilder<K, V> {
self.into()
}
}
impl<K: Puff + Hash + Eq, V: Puff> Into<MapBuilder<K, V>> for HashMap<K, V> {
fn into(self) -> MapBuilder<K, V> {
MapBuilder(self)
}
}
impl<K: Puff + Hash + Eq, V: Puff> Into<MapBuilder<K, V>> for Vec<(K, V)> {
fn into(self) -> MapBuilder<K, V> {
MapBuilder(self.into_iter().collect())
}
}