Skip to main content

atomr_distributed_data/
flag.rs

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