mirror of
https://github.com/Zenithsiz/dynatos.git
synced 2026-02-04 02:18:40 +00:00
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:
parent
bee58c76a2
commit
c19c2ecddc
@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user