1use im::OrdSet as ArcOrdSet;
5use pergola::{ArcOrdSetWithUnion, DefTraits, LatticeElt, Tuple2};
19
20pub type PeerSetLD<Peer> = ArcOrdSetWithUnion<Peer>;
21pub type PeerSetLE<Peer> = LatticeElt<PeerSetLD<Peer>>;
22pub type CfgLD<Peer> = Tuple2<PeerSetLD<Peer>, PeerSetLD<Peer>>;
23pub type CfgLE<Peer> = LatticeElt<CfgLD<Peer>>;
24
25pub trait CfgLEExt<Peer: DefTraits> {
27 fn added_peers_elt(&self) -> &PeerSetLE<Peer>;
28 fn added_peers_elt_mut(&mut self) -> &mut PeerSetLE<Peer>;
29 fn added_peers(&self) -> &ArcOrdSet<Peer>;
30 fn added_peers_mut(&mut self) -> &mut ArcOrdSet<Peer>;
31
32 fn removed_peers_elt(&self) -> &PeerSetLE<Peer>;
33 fn removed_peers_elt_mut(&mut self) -> &mut PeerSetLE<Peer>;
34 fn removed_peers(&self) -> &ArcOrdSet<Peer>;
35 fn removed_peers_mut(&mut self) -> &mut ArcOrdSet<Peer>;
36
37 fn members(&self) -> ArcOrdSet<Peer>;
38}
39
40impl<Peer: DefTraits> CfgLEExt<Peer> for CfgLE<Peer> {
41 fn added_peers_elt(&self) -> &PeerSetLE<Peer> {
42 &self.value.0
43 }
44 fn added_peers_elt_mut(&mut self) -> &mut PeerSetLE<Peer> {
45 &mut self.value.0
46 }
47 fn added_peers(&self) -> &ArcOrdSet<Peer> {
48 &self.added_peers_elt().value
49 }
50 fn added_peers_mut(&mut self) -> &mut ArcOrdSet<Peer> {
51 &mut self.added_peers_elt_mut().value
52 }
53
54 fn removed_peers_elt(&self) -> &PeerSetLE<Peer> {
55 &self.value.1
56 }
57 fn removed_peers_elt_mut(&mut self) -> &mut PeerSetLE<Peer> {
58 &mut self.value.1
59 }
60 fn removed_peers(&self) -> &ArcOrdSet<Peer> {
61 &self.removed_peers_elt().value
62 }
63 fn removed_peers_mut(&mut self) -> &mut ArcOrdSet<Peer> {
64 &mut self.removed_peers_elt_mut().value
65 }
66
67 fn members(&self) -> ArcOrdSet<Peer> {
68 self.added_peers()
69 .clone()
70 .difference(self.removed_peers().clone())
71 }
72}