use any_key::AnyHash;
use std::sync::Arc;
#[derive(Clone, PartialEq, Eq, Hash, Debug)]
pub enum ElementKey {
Decl(u128),
User(Arc<dyn AnyHash + Send + Sync>),
}
impl ElementKey {
pub fn decl(decl_key: u128) -> Self {
Self::Decl(decl_key)
}
pub fn user<T>(key: T) -> Self
where
T: Send + Sync + AnyHash,
{
Self::User(Arc::new(key))
}
}
#[cfg(test)]
mod tests {
use super::ElementKey;
use std::collections::HashSet;
#[test]
fn decl_and_user_never_collide() {
assert_ne!(ElementKey::decl(42), ElementKey::user((42u128, "x")));
}
#[test]
fn decl_equality_by_value() {
assert_eq!(ElementKey::decl(7), ElementKey::decl(7));
assert_ne!(ElementKey::decl(7), ElementKey::decl(8));
}
#[test]
fn user_equality_by_tuple() {
assert_eq!(
ElementKey::user((1u128, "a")),
ElementKey::user((1u128, "a"))
);
assert_ne!(
ElementKey::user((1u128, "a")),
ElementKey::user((1u128, "b"))
);
assert_ne!(
ElementKey::user((1u128, "a")),
ElementKey::user((2u128, "a"))
);
}
#[test]
fn hash_consistent_with_eq() {
let mut set = HashSet::new();
set.insert(ElementKey::decl(1));
set.insert(ElementKey::decl(1)); set.insert(ElementKey::user((1u128, "a")));
assert_eq!(set.len(), 2);
}
}