1use std::sync::Arc;
17use crate::option::OptionCell;
18
19pub struct Writer<T> {
21 inner: Arc<OptionCell<Arc<T>>>,
22 val: Arc<T>
23}
24
25impl<T> Writer<T> {
26 fn new(cell: Arc<OptionCell<Arc<T>>>) -> Self {
27 let val = cell.take().unwrap();
28 cell.replace(val.clone());
29
30 Self {
31 inner: cell,
32 val,
33 }
34 }
35
36 pub fn write(&mut self, val: T) {
47 self.val = Arc::new(val);
48 self.inner.replace(self.val.clone());
49 }
50
51 pub fn read(&self) -> &T {
53 &self.val
54 }
55}
56
57pub struct Reader<T> {
59 cell: Arc<OptionCell<Arc<T>>>,
60 val: Arc<T>
61}
62
63impl<T> Reader<T> {
64 fn new(cell: Arc<OptionCell<Arc<T>>>) -> Self {
65 Self {
66 val: cell.take().unwrap(),
67 cell,
68 }
69 }
70
71 pub fn read_with_is_new(&mut self) -> (&T, bool) {
83 match self.cell.take() {
84 None => (&self.val, false),
85 Some(val) => {
86 self.val = val;
87 (&*self.val, true)
88 }
89 }
90 }
91
92 pub fn read(&mut self) -> &T {
94 match self.cell.take() {
95 None => &self.val,
96 Some(val) => {
97 self.val = val;
98 &self.val
99 }
100 }
101 }
102}
103
104pub fn new<T>(val: T) -> (Writer<T>, Reader<T>) {
116 let cell = Arc::new(OptionCell::new(Arc::new(val)));
117 (Writer::new(cell.clone()), Reader::new(cell))
118}
119
120pub fn default<T>() -> (Writer<T>, Reader<T>)
121where
122 T: Default
123{
124 let cell = Arc::new(OptionCell::new(Arc::new(T::default())));
125 (Writer::new(cell.clone()), Reader::new(cell))
126}
127
128
129#[cfg(test)]
130mod test {
131 use crate::bridge;
132
133 #[test]
134 fn test_read() {
135 let (mut w, mut r) = bridge::new(vec!["fffff"; 1000]);
136 assert_eq!(r.read(), &vec!["fffff"; 1000]);
137 w.write(vec!["Not good, but ok"]);
138 assert_eq!(r.read(), &vec!["Not good, but ok"]);
139 }
140
141 #[test]
142 fn test_clone() {
143 let (mut tx, mut rx) = bridge::new(vec!["fffff"; 1000]);
144 assert_eq!(rx.read(), &vec!["fffff"; 1000]);
145 tx.write(vec!["Not good, but ok"]);
146 assert_eq!(rx.read(), &vec!["Not good, but ok"]);
147 }
148
149 #[test]
150 fn test_read_with_is_new() {
151 let (mut w, mut r) = bridge::new(vec!["fffff"; 1000]);
152 assert_eq!(r.read_with_is_new(), (&vec!["fffff"; 1000], false));
153 w.write(vec!["Not good"]);
154 assert_eq!(r.read_with_is_new(), (&vec!["Not good"], true));
155 }
156}