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