use std::collections::HashMap;
use std::hash::Hash;
use std::ops::{Index, IndexMut};
use std::slice::{Iter, IterMut};
pub struct MapNode<K, V> {
key: K,
value: V,
}
impl<K, V> MapNode<K, V> {
pub fn value(&self) -> &V {
&self.value
}
}
pub struct Map<K, V> {
keys: HashMap<K, usize>,
values: Vec<MapNode<K, V>>,
}
impl<K: Clone + Eq + Hash, V> Map<K, V> {
pub fn new() -> Map<K, V> {
Map {
keys: HashMap::new(),
values: vec![],
}
}
pub fn insert(&mut self, key: K, value: V) {
match self.keys.get(&key) {
None => {
self.keys.insert(key.clone(), self.values.len());
self.values.push(MapNode { key, value });
}
Some(index) => self.values[*index] = MapNode { key, value }
}
}
pub fn iter(&self) -> MapIter<'_, K, V> {
MapIter { inner: self.values.iter() }
}
pub fn iter_mut(&mut self) -> MapIterMut<'_, K, V> {
MapIterMut { inner: self.values.iter_mut() }
}
pub fn entry_mut(&mut self) -> EntryMapIterMut<'_, K, V> {
EntryMapIterMut { inner: self.values.iter_mut() }
}
pub fn get(&self, key: &K) -> Option<&V> {
let index = self.keys.get(key)?;
Some(&self.values.get(*index)?.value)
}
pub fn get_mut(&mut self, key: &K) -> Option<&mut V> {
let index = self.keys.get(key)?;
Some(&mut self.values.get_mut(*index)?.value)
}
pub fn remove(&mut self, key: &K) -> Option<V> {
let index = self.keys.remove(key)?;
let value = self.values.remove(index).value;
self.keys.clear();
self.values.iter().enumerate().for_each(|(i, v)| {
self.keys.insert(v.key.clone(), i);
});
Some(value)
}
pub fn remove_map_by_index(&mut self, index: usize) -> (K, V) {
let res = self.values.remove(index);
self.keys.remove(&res.key);
self.keys.clear();
self.values.iter().enumerate().for_each(|(i, v)| {
self.keys.insert(v.key.clone(), i);
});
(res.key, res.value)
}
pub fn len(&self) -> usize {
self.values.len()
}
pub fn first(&self) -> Option<&V> {
Some(&self.values.first()?.value)
}
pub fn last(&self) -> Option<&V> {
Some(&self.values.last()?.value)
}
pub fn last_mut(&mut self) -> Option<&mut V> {
Some(&mut self.values.last_mut()?.value)
}
pub fn has_key(&mut self, key: &K) -> bool {
self.keys.contains_key(key)
}
pub fn position(&self, key: &K) -> Option<&usize> {
self.keys.get(key)
}
pub fn clear(&mut self) {
self.keys.clear();
self.values.clear();
}
pub fn reverse(&mut self) {
self.keys.clear();
self.values.reverse();
self.values.iter().enumerate().for_each(|(i, x)| { self.keys.insert(x.key.clone(), i); });
}
pub fn sort_by_key<SK, F>(&mut self, f: F)
where
F: FnMut(&MapNode<K, V>) -> SK,
SK: Ord,
{
self.values.sort_by_key(f);
self.keys.clear();
self.values.iter().enumerate().for_each(|(index, v)| {
self.keys.insert(v.key.clone(), index);
})
}
}
impl<K, V> Index<usize> for Map<K, V> {
type Output = V;
fn index(&self, index: usize) -> &Self::Output {
&self.values[index].value
}
}
impl<K, V> IndexMut<usize> for Map<K, V> {
fn index_mut(&mut self, index: usize) -> &mut Self::Output {
&mut self.values[index].value
}
}
impl<K: Eq + Hash, V> Index<&K> for Map<K, V> {
type Output = V;
fn index(&self, index: &K) -> &Self::Output {
let index = self.keys[index];
&self.values[index].value
}
}
impl<K: Eq + Hash, V> IndexMut<&K> for Map<K, V> {
fn index_mut(&mut self, index: &K) -> &mut Self::Output {
let index = self.keys[index];
&mut self.values[index].value
}
}
impl<K: Clone + Eq + Hash, V> Default for Map<K, V> {
fn default() -> Self {
Map::new()
}
}
pub struct MapIter<'a, K, V> {
inner: Iter<'a, MapNode<K, V>>,
}
impl<'a, K, V> Iterator for MapIter<'a, K, V> {
type Item = &'a V;
fn next(&mut self) -> Option<Self::Item> {
let item = self.inner.next()?;
Some(&item.value)
}
}
pub struct MapIterMut<'a, K, V> {
inner: IterMut<'a, MapNode<K, V>>,
}
impl<'a, K, V> Iterator for MapIterMut<'a, K, V> {
type Item = &'a mut V;
fn next(&mut self) -> Option<Self::Item> {
let item = self.inner.next()?;
Some(&mut item.value)
}
}
pub struct EntryMapIterMut<'a, K, V> {
inner: IterMut<'a, MapNode<K, V>>,
}
impl<'a, K, V> Iterator for EntryMapIterMut<'a, K, V> {
type Item = (&'a K, &'a mut V);
fn next(&mut self) -> Option<Self::Item> {
let item = self.inner.next()?;
Some((&item.key, &mut item.value))
}
}