boarddown_core/crdt/
mod.rs1pub use self::changeset::*;
2pub use self::vector::*;
3
4mod changeset;
5mod vector;
6
7use serde::{Deserialize, Serialize};
8use std::sync::atomic::{AtomicU64, Ordering};
9
10static CLIENT_COUNTER: AtomicU64 = AtomicU64::new(0);
11
12#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
13pub struct Version(pub u64);
14
15impl Version {
16 pub fn initial() -> Self {
17 Self(0)
18 }
19
20 pub fn increment(&self) -> Self {
21 Self(self.0 + 1)
22 }
23}
24
25impl Default for Version {
26 fn default() -> Self {
27 Self::initial()
28 }
29}
30
31#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
32pub struct ClientId(pub u64);
33
34impl ClientId {
35 pub fn new() -> Self {
36 use std::time::{SystemTime, UNIX_EPOCH};
37
38 let timestamp = SystemTime::now()
39 .duration_since(UNIX_EPOCH)
40 .unwrap()
41 .as_nanos() as u64;
42
43 let counter = CLIENT_COUNTER.fetch_add(1, Ordering::SeqCst);
44
45 Self(timestamp.wrapping_add(counter))
46 }
47
48 pub fn value(&self) -> u64 {
49 self.0
50 }
51}
52
53impl Default for ClientId {
54 fn default() -> Self {
55 Self::new()
56 }
57}