use std::hash::Hasher;
use derive_more::Deref;
pub type HashId = u64;
pub use rustc_hash::FxHashMap as HashMap;
pub use rustc_hash::FxHashSet as HashSet;
pub trait ComputedHash {
fn computed_hash(&self) -> HashId;
}
#[derive(Deref, Debug, Clone)]
pub struct Hashed<T: std::hash::Hash> {
#[deref]
inner: T,
hash: HashId,
}
impl<T: std::hash::Hash> Hashed<T> {
pub fn new(inner: T) -> Self {
let mut hasher = rustc_hash::FxHasher::default();
inner.hash(&mut hasher);
Self {
inner,
hash: hasher.finish(),
}
}
pub fn map<U: std::hash::Hash, F>(self, f: F) -> Hashed<U>
where
F: FnOnce(T) -> U,
{
let new_inner = f(self.inner);
Hashed::new(new_inner)
}
pub fn value(&self) -> &T {
&self.inner
}
}
impl<T: std::hash::Hash> ComputedHash for Hashed<T> {
fn computed_hash(&self) -> HashId {
self.hash
}
}