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(),
}
}
}
impl<T: std::hash::Hash> ComputedHash for Hashed<T> {
fn computed_hash(&self) -> HashId {
self.hash
}
}