Skip to content

Commit d903d5f

Browse files
committed
Refactored the Effect creation logic
1 parent 28d0388 commit d903d5f

File tree

5 files changed

+19
-20
lines changed

5 files changed

+19
-20
lines changed

cache/src/cache.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ pub(crate) fn touch<T: 'static>(key: &'static dyn Observable) -> Option<Rc<T>> {
1717
// When the Effect performs dependency calculations for the first time,
1818
// it must ignore the relevant cache,
1919
// otherwise the underlying Signal will not remember the Effect.
20-
if crate::current_effect_peak().is_some() {
20+
if crate::creating_effect_peak().is_some() {
2121
remove_from_cache(key);
2222
return None;
2323
}

cache/src/call_stack.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
#![allow(static_mut_refs)]
22

3-
use std::rc::Rc;
3+
use std::rc::Weak;
44

55
use once_cell::sync::Lazy;
66

77
use crate::{Effect, Observable};
88

99
static mut CALL_STACK: Lazy<Vec<&'static dyn Observable>> = Lazy::new(Vec::new);
1010

11-
static mut CURRENT_EFFECT: Option<Rc<Effect>> = None;
11+
static mut CREATING_EFFECT: Option<Weak<Effect>> = None;
1212

1313
pub(crate) fn push(op: &'static dyn Observable) {
1414
unsafe { CALL_STACK.push(op) }
@@ -22,16 +22,16 @@ pub(crate) fn pop() -> Option<&'static dyn Observable> {
2222
unsafe { CALL_STACK.pop() }
2323
}
2424

25-
pub(crate) fn current_effect_push(effect: Rc<Effect>) {
26-
assert!(unsafe { CURRENT_EFFECT.is_none() });
27-
unsafe { CURRENT_EFFECT = Some(effect) }
25+
pub(crate) fn creating_effect_push(effect: Weak<Effect>) {
26+
assert!(unsafe { CREATING_EFFECT.is_none() });
27+
unsafe { CREATING_EFFECT = Some(effect) }
2828
}
2929

30-
pub(crate) fn current_effect_peak() -> Option<Rc<Effect>> {
31-
unsafe { CURRENT_EFFECT.clone() }
30+
pub(crate) fn creating_effect_peak() -> Option<Weak<Effect>> {
31+
unsafe { CREATING_EFFECT.clone() }
3232
}
3333

34-
pub(crate) fn current_effect_pop() -> Rc<Effect> {
35-
assert!(unsafe { CURRENT_EFFECT.is_some() });
36-
unsafe { CURRENT_EFFECT.take().unwrap() }
34+
pub(crate) fn creating_effect_pop() -> Weak<Effect> {
35+
assert!(unsafe { CREATING_EFFECT.is_some() });
36+
unsafe { CREATING_EFFECT.take().unwrap() }
3737
}

cache/src/effect.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ impl Effect {
88
pub fn new(f: impl Fn() + 'static) -> Rc<Self> {
99
let e = Rc::new(Effect { f: Box::new(f) });
1010

11-
crate::current_effect_push(e.clone());
11+
crate::creating_effect_push(Rc::downgrade(&e));
1212
e.run();
13-
crate::current_effect_pop();
13+
crate::creating_effect_pop();
1414

1515
e
1616
}

cache/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ pub mod memo;
66
pub mod signal;
77

88
pub(crate) use cache::{remove_from_cache, store_in_cache, touch};
9-
pub(crate) use call_stack::{current_effect_peak, current_effect_pop, current_effect_push};
9+
pub(crate) use call_stack::{creating_effect_peak, creating_effect_pop, creating_effect_push};
1010
pub use effect::Effect;
1111
pub use memo::Memo;
1212
pub use signal::Signal;

cache/src/signal.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::{
22
cell::{Ref, RefCell},
3-
rc::{Rc, Weak},
3+
rc::Weak,
44
};
55

66
use crate::{Effect, Observable, call_stack};
@@ -62,11 +62,10 @@ where
6262
self.dependents.borrow_mut().push(*last);
6363
}
6464

65-
if let Some(e) = call_stack::current_effect_peak() {
66-
let e = Rc::downgrade(&e);
67-
if !self.effects.borrow().iter().any(|w| Weak::ptr_eq(w, &e)) {
68-
self.effects.borrow_mut().push(e);
69-
}
65+
if let Some(e) = call_stack::creating_effect_peak()
66+
&& !self.effects.borrow().iter().any(|w| Weak::ptr_eq(w, &e))
67+
{
68+
self.effects.borrow_mut().push(e);
7069
}
7170

7271
self.value.borrow()

0 commit comments

Comments
 (0)