//! This module contains the [Bijection] type. use super::HashMapWithDefault; use log::error; use std::{borrow::Borrow, hash::Hash}; pub struct Bijection { k2v: HashMapWithDefault, v2k: HashMapWithDefault, } impl Bijection { pub fn new(default_key: K, default_value: V) -> Self { let k2v = HashMapWithDefault::new(default_value); let v2k = HashMapWithDefault::new(default_key); Self { k2v, v2k } } pub fn k2v(&self) -> &HashMapWithDefault { &self.k2v } pub fn v2k(&self) -> &HashMapWithDefault { &self.v2k } } impl Bijection { pub fn insert(&mut self, key: K, value: V) -> Option<(K, V)> { let key_clone = key.clone(); let value_clone = value.clone(); let old_value = self.k2v.get_mut().insert(key, value); let old_key = self.v2k.get_mut().insert(value_clone, key_clone); match (old_key, old_value) { (Some(old_key), Some(old_value)) => Some((old_key, old_value)), (None, None) => None, _ => { error!("logic error: unmatched key-value pair encountered in bijection insert"); None } } } } impl Bijection { pub fn value(&self, key: &Q) -> &V where K: Borrow, { self.k2v.get(key) } } impl Bijection { pub fn key(&self, value: &R) -> &K where V: Borrow, { self.v2k.get(value) } }