lazy_observer/
observable.rs1use std::borrow;
2use std::cmp::*;
3use std::fmt;
4use std::hash::*;
5use std::ops::*;
6use std::pin::Pin;
7use std::rc::Rc;
8
9use super::dirty_marker::DirtyMarker;
10use super::notify_updater;
11
12pub struct Observable<T> {
13 data: T,
14 dirty: Pin<Rc<DirtyMarker>>,
15}
16
17impl<T> Observable<T> {
18 #[inline]
19 pub fn new(data: T) -> Self {
20 Self {
21 data,
22 dirty: Rc::pin(DirtyMarker::new(false)),
23 }
24 }
25}
26
27impl<T> Drop for Observable<T> {
28 fn drop(&mut self) {
29 self.dirty.destroy();
30 }
31}
32
33impl<T> Deref for Observable<T> {
34 type Target = T;
35 #[inline]
36 fn deref(&self) -> &T {
37 notify_updater(&self.dirty);
38 &self.data
39 }
40}
41
42impl<T> DerefMut for Observable<T> {
43 #[inline]
44 fn deref_mut(&mut self) -> &mut T {
45 self.dirty.mark_connected_dirty();
46 notify_updater(&self.dirty);
47 &mut self.data
48 }
49}
50
51impl<T: PartialEq> PartialEq for Observable<T> {
52 fn eq(&self, other: &Self) -> bool {
53 self.data == other.data
54 }
55}
56
57impl<T: Eq> Eq for Observable<T> {}
58
59impl<T: PartialOrd> PartialOrd for Observable<T> {
60 #[inline]
61 fn partial_cmp(&self, other: &Observable<T>) -> Option<Ordering> {
62 PartialOrd::partial_cmp(&**self, &**other)
63 }
64 #[inline]
65 fn lt(&self, other: &Observable<T>) -> bool {
66 PartialOrd::lt(&**self, &**other)
67 }
68 #[inline]
69 fn le(&self, other: &Observable<T>) -> bool {
70 PartialOrd::le(&**self, &**other)
71 }
72 #[inline]
73 fn ge(&self, other: &Observable<T>) -> bool {
74 PartialOrd::ge(&**self, &**other)
75 }
76 #[inline]
77 fn gt(&self, other: &Observable<T>) -> bool {
78 PartialOrd::gt(&**self, &**other)
79 }
80}
81
82impl<T: Ord> Ord for Observable<T> {
83 #[inline]
84 fn cmp(&self, other: &Observable<T>) -> Ordering {
85 Ord::cmp(&**self, &**other)
86 }
87}
88
89impl<T: Hasher> Hasher for Observable<T> {
90 fn finish(&self) -> u64 {
91 (**self).finish()
92 }
93 fn write(&mut self, bytes: &[u8]) {
94 (**self).write(bytes)
95 }
96 fn write_u8(&mut self, i: u8) {
97 (**self).write_u8(i)
98 }
99 fn write_u16(&mut self, i: u16) {
100 (**self).write_u16(i)
101 }
102 fn write_u32(&mut self, i: u32) {
103 (**self).write_u32(i)
104 }
105 fn write_u64(&mut self, i: u64) {
106 (**self).write_u64(i)
107 }
108 fn write_u128(&mut self, i: u128) {
109 (**self).write_u128(i)
110 }
111 fn write_usize(&mut self, i: usize) {
112 (**self).write_usize(i)
113 }
114 fn write_i8(&mut self, i: i8) {
115 (**self).write_i8(i)
116 }
117 fn write_i16(&mut self, i: i16) {
118 (**self).write_i16(i)
119 }
120 fn write_i32(&mut self, i: i32) {
121 (**self).write_i32(i)
122 }
123 fn write_i64(&mut self, i: i64) {
124 (**self).write_i64(i)
125 }
126 fn write_i128(&mut self, i: i128) {
127 (**self).write_i128(i)
128 }
129 fn write_isize(&mut self, i: isize) {
130 (**self).write_isize(i)
131 }
132}
133
134impl<T: Hash> Hash for Observable<T> {
135 fn hash<H: Hasher>(&self, state: &mut H) {
136 (**self).hash(state);
137 }
138}
139
140impl<T> borrow::Borrow<T> for Observable<T> {
141 fn borrow(&self) -> &T {
142 &**self
143 }
144}
145
146impl<T> borrow::BorrowMut<T> for Observable<T> {
147 fn borrow_mut(&mut self) -> &mut T {
148 &mut **self
149 }
150}
151
152impl<T> AsRef<T> for Observable<T> {
153 fn as_ref(&self) -> &T {
154 &**self
155 }
156}
157
158impl<T> AsMut<T> for Observable<T> {
159 fn as_mut(&mut self) -> &mut T {
160 &mut **self
161 }
162}
163
164impl<T: Default> Default for Observable<T> {
165 fn default() -> Observable<T> {
166 Self {
167 data: Default::default(),
168 dirty: Rc::pin(DirtyMarker::new(false)),
169 }
170 }
171}
172
173impl<T: Clone> Clone for Observable<T> {
174 #[inline]
175 fn clone(&self) -> Observable<T> {
176 Self {
177 data: (**self).clone(),
178 dirty: Rc::pin(DirtyMarker::new(false)),
179 }
180 }
181}
182
183impl<T: fmt::Display> fmt::Display for Observable<T> {
184 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
185 fmt::Display::fmt(&**self, f)
186 }
187}
188
189impl<T: fmt::Debug> fmt::Debug for Observable<T> {
190 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
191 fmt::Debug::fmt(&**self, f)
192 }
193}