use std::borrow; use std::cmp::*; use std::fmt; use std::hash::*; use std::ops::*; use std::pin::Pin; use std::rc::Rc; use super::dirty_marker::DirtyMarker; use super::notify_updater; pub struct Observable { data: T, dirty: Pin>, } impl Observable { #[inline] pub fn new(data: T) -> Self { Self { data, dirty: Rc::pin(DirtyMarker::new(false)), } } } impl Drop for Observable { fn drop(&mut self) { self.dirty.destroy(); } } impl Deref for Observable { type Target = T; #[inline] fn deref(&self) -> &T { notify_updater(&self.dirty); &self.data } } impl DerefMut for Observable { #[inline] fn deref_mut(&mut self) -> &mut T { self.dirty.mark_connected_dirty(); notify_updater(&self.dirty); &mut self.data } } impl PartialEq for Observable { fn eq(&self, other: &Self) -> bool { self.data == other.data } } impl Eq for Observable {} impl PartialOrd for Observable { #[inline] fn partial_cmp(&self, other: &Observable) -> Option { PartialOrd::partial_cmp(&**self, &**other) } #[inline] fn lt(&self, other: &Observable) -> bool { PartialOrd::lt(&**self, &**other) } #[inline] fn le(&self, other: &Observable) -> bool { PartialOrd::le(&**self, &**other) } #[inline] fn ge(&self, other: &Observable) -> bool { PartialOrd::ge(&**self, &**other) } #[inline] fn gt(&self, other: &Observable) -> bool { PartialOrd::gt(&**self, &**other) } } impl Ord for Observable { #[inline] fn cmp(&self, other: &Observable) -> Ordering { Ord::cmp(&**self, &**other) } } impl Hasher for Observable { fn finish(&self) -> u64 { (**self).finish() } fn write(&mut self, bytes: &[u8]) { (**self).write(bytes) } fn write_u8(&mut self, i: u8) { (**self).write_u8(i) } fn write_u16(&mut self, i: u16) { (**self).write_u16(i) } fn write_u32(&mut self, i: u32) { (**self).write_u32(i) } fn write_u64(&mut self, i: u64) { (**self).write_u64(i) } fn write_u128(&mut self, i: u128) { (**self).write_u128(i) } fn write_usize(&mut self, i: usize) { (**self).write_usize(i) } fn write_i8(&mut self, i: i8) { (**self).write_i8(i) } fn write_i16(&mut self, i: i16) { (**self).write_i16(i) } fn write_i32(&mut self, i: i32) { (**self).write_i32(i) } fn write_i64(&mut self, i: i64) { (**self).write_i64(i) } fn write_i128(&mut self, i: i128) { (**self).write_i128(i) } fn write_isize(&mut self, i: isize) { (**self).write_isize(i) } } impl Hash for Observable { fn hash(&self, state: &mut H) { (**self).hash(state); } } impl borrow::Borrow for Observable { fn borrow(&self) -> &T { &**self } } impl borrow::BorrowMut for Observable { fn borrow_mut(&mut self) -> &mut T { &mut **self } } impl AsRef for Observable { fn as_ref(&self) -> &T { &**self } } impl AsMut for Observable { fn as_mut(&mut self) -> &mut T { &mut **self } } impl Default for Observable { fn default() -> Observable { Self { data: Default::default(), dirty: Rc::pin(DirtyMarker::new(false)), } } } impl Clone for Observable { #[inline] fn clone(&self) -> Observable { Self { data: (**self).clone(), dirty: Rc::pin(DirtyMarker::new(false)), } } } impl fmt::Display for Observable { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fmt::Display::fmt(&**self, f) } } impl fmt::Debug for Observable { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fmt::Debug::fmt(&**self, f) } }