use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(transparent)]
pub struct Lineage(u64);
impl Lineage {
pub const EMPTY: Self = Self(0);
pub const DETACHED: Self = Self(u64::MAX);
pub fn fresh() -> Self {
let now = web_time::SystemTime::now()
.duration_since(web_time::UNIX_EPOCH)
.unwrap_or_default();
let clock = now.as_secs().rotate_left(32) ^ u64::from(now.subsec_nanos());
Self((fastrand::u64(..) ^ clock).clamp(1, u64::MAX - 1))
}
pub fn is_log(self) -> bool {
self != Self::EMPTY && self != Self::DETACHED
}
}