Reduced size of Signal.

With the previous commit, it doubled, since it had to store 2 `Rc`s, but now it stores just one.
This commit is contained in:
Filipe Rodrigues 2024-02-05 19:55:55 +00:00
parent bee58c76a2
commit c19c2ecddc
Signed by: zenithsiz
SSH Key Fingerprint: SHA256:Mb5ppb3Sh7IarBO/sBTXLHbYEOz37hJAlslLQPPAPaU

View File

@ -9,22 +9,29 @@ use {
std::{cell::RefCell, fmt, mem, rc::Rc},
};
/// Signal
pub struct Signal<T> {
/// Inner
struct Inner<T> {
/// Value
value: Rc<RefCell<T>>,
value: RefCell<T>,
/// Trigger
trigger: Trigger,
}
/// Signal
pub struct Signal<T> {
/// Inner
inner: Rc<Inner<T>>,
}
impl<T> Signal<T> {
/// 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<T> SignalWith for Signal<T> {
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<T> SignalUpdate for Signal<T> {
// 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<T> SignalUpdate for Signal<T> {
};
// Then trigger our trigger
self.trigger.trigger();
self.inner.trigger.trigger();
output
}
@ -93,15 +105,17 @@ impl<T> SignalUpdate for Signal<T> {
impl<T> Clone for Signal<T> {
fn clone(&self) -> Self {
Self {
value: Rc::clone(&self.value),
trigger: self.trigger.clone(),
inner: Rc::clone(&self.inner),
}
}
}
impl<T: fmt::Debug> fmt::Debug for Signal<T> {
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()
}
}