atomr_distributed_data/
flag.rs1use 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(); a.merge(&b);
52 assert!(a.enabled());
54 }
55}