Skip to main content

atomr_distributed_data/
flag.rs

1//! `Flag` CRDT — monotonic boolean (false → true; once true, stays true).
2
3use serde::{Deserialize, Serialize};
4
5use crate::traits::CrdtMerge;
6
7#[derive(Debug, Default, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
8pub struct Flag {
9    enabled: bool,
10}
11
12impl Flag {
13    pub fn new() -> Self {
14        Self::default()
15    }
16
17    pub fn switch_on(&mut self) {
18        self.enabled = true;
19    }
20
21    pub fn enabled(&self) -> bool {
22        self.enabled
23    }
24}
25
26impl CrdtMerge for Flag {
27    fn merge(&mut self, other: &Self) {
28        self.enabled = self.enabled || other.enabled;
29    }
30}
31
32#[cfg(test)]
33mod tests {
34    use super::*;
35
36    #[test]
37    fn merge_is_logical_or() {
38        let mut a = Flag::new();
39        let mut b = Flag::new();
40        b.switch_on();
41        a.merge(&b);
42        assert!(a.enabled());
43    }
44
45    #[test]
46    fn flag_is_monotonic() {
47        let mut a = Flag::new();
48        a.switch_on();
49        let b = Flag::new(); // false
50        a.merge(&b);
51        // Already-on stays on regardless of merge order.
52        assert!(a.enabled());
53    }
54}