freya-core 0.4.0-rc.7

Reactivity runtime, tree management, accessibility integration, rendering pipeline and more, for Freya
Documentation
use std::{
    hash::Hash,
    rc::Rc,
};
#[derive(PartialEq, Hash, Eq, Clone, Debug, Default)]
pub enum DiffKey {
    Root,
    U64(u64),
    #[default]
    None,
}

impl DiffKey {
    pub fn or(self, other: DiffKey) -> Self {
        match self {
            Self::None => other,
            _ => self,
        }
    }

    pub fn new_rc<T: ?Sized>(rc: &Rc<T>) -> Self {
        use std::hash::Hasher;
        let mut hasher = std::hash::DefaultHasher::default();
        Rc::as_ptr(rc).hash(&mut hasher);
        DiffKey::U64(hasher.finish())
    }
}

impl<T: std::hash::Hash> From<&T> for DiffKey {
    fn from(value: &T) -> Self {
        use std::hash::Hasher;
        let mut hasher = std::hash::DefaultHasher::default();
        value.hash(&mut hasher);
        DiffKey::U64(hasher.finish())
    }
}

impl<A, R> From<fn(&A) -> R> for DiffKey {
    fn from(value: fn(&A) -> R) -> Self {
        Self::U64(value as *const () as u64)
    }
}

#[allow(coherence_leak_check)]
impl<A, R> From<fn(A) -> R> for DiffKey {
    fn from(value: fn(A) -> R) -> Self {
        Self::U64(value as *const () as u64)
    }
}

impl<R> From<fn() -> R> for DiffKey {
    fn from(value: fn() -> R) -> Self {
        Self::U64(value as *const () as u64)
    }
}