diff --git a/dynatos-reactive/src/signal.rs b/dynatos-reactive/src/signal.rs index 97d952e..0cbfdfb 100644 --- a/dynatos-reactive/src/signal.rs +++ b/dynatos-reactive/src/signal.rs @@ -9,22 +9,29 @@ use { std::{cell::RefCell, fmt, mem, rc::Rc}, }; -/// Signal -pub struct Signal { +/// Inner +struct Inner { /// Value - value: Rc>, + value: RefCell, /// Trigger trigger: Trigger, } +/// Signal +pub struct Signal { + /// Inner + inner: Rc>, +} + impl Signal { /// Creates a new signal pub fn new(value: T) -> Self { - Self { - value: Rc::new(RefCell::new(value)), + let inner = Inner { + value: RefCell::new(value), trigger: Trigger::new(), - } + }; + Self { inner: Rc::new(inner) } } } @@ -47,10 +54,14 @@ impl SignalWith for Signal { F: FnOnce(&Self::Value) -> O, { if let Some(effect) = Effect::running() { - self.trigger.add_subscriber(effect); + self.inner.trigger.add_subscriber(effect); } - let value = self.value.try_borrow().expect("Cannot use signal value while updating"); + let value = self + .inner + .value + .try_borrow() + .expect("Cannot use signal value while updating"); f(&value) } } @@ -77,6 +88,7 @@ impl SignalUpdate for Signal { // Update the value and get the output let output = { let mut value = self + .inner .value .try_borrow_mut() .expect("Cannot update signal value while using it"); @@ -84,7 +96,7 @@ impl SignalUpdate for Signal { }; // Then trigger our trigger - self.trigger.trigger(); + self.inner.trigger.trigger(); output } @@ -93,15 +105,17 @@ impl SignalUpdate for Signal { impl Clone for Signal { fn clone(&self) -> Self { Self { - value: Rc::clone(&self.value), - trigger: self.trigger.clone(), + inner: Rc::clone(&self.inner), } } } impl fmt::Debug for Signal { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("Signal").field("value", &*self.value.borrow()).finish() + f.debug_struct("Signal") + .field("value", &*self.inner.value.borrow()) + .field("trigger", &self.inner.trigger) + .finish() } }