Skip to content

Commit ee613ac

Browse files
committed
refactor(cache): Refactored the effect module and added the IEffect trait.
- Genericized the Effect struct to support any Fn() type. - Adjusted the memo and signal modules to adapt to the new IEffect interface. - Optimized some code structure to improve readability and maintainability.
1 parent d903d5f commit ee613ac

File tree

5 files changed

+47
-28
lines changed

5 files changed

+47
-28
lines changed

cache/src/call_stack.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ use std::rc::Weak;
44

55
use once_cell::sync::Lazy;
66

7-
use crate::{Effect, Observable};
7+
use crate::{IEffect, Observable};
88

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

11-
static mut CREATING_EFFECT: Option<Weak<Effect>> = None;
11+
static mut CREATING_EFFECT: Option<Weak<dyn IEffect>> = 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 creating_effect_push(effect: Weak<Effect>) {
25+
pub(crate) fn creating_effect_push(effect: Weak<dyn IEffect>) {
2626
assert!(unsafe { CREATING_EFFECT.is_none() });
2727
unsafe { CREATING_EFFECT = Some(effect) }
2828
}
2929

30-
pub(crate) fn creating_effect_peak() -> Option<Weak<Effect>> {
30+
pub(crate) fn creating_effect_peak() -> Option<Weak<dyn IEffect>> {
3131
unsafe { CREATING_EFFECT.clone() }
3232
}
3333

34-
pub(crate) fn creating_effect_pop() -> Weak<Effect> {
34+
pub(crate) fn creating_effect_pop() -> Weak<dyn IEffect> {
3535
assert!(unsafe { CREATING_EFFECT.is_some() });
3636
unsafe { CREATING_EFFECT.take().unwrap() }
3737
}

cache/src/effect.rs

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,40 @@
11
use std::rc::Rc;
22

3-
pub struct Effect {
4-
f: Box<dyn Fn()>,
3+
pub struct Effect<F>
4+
where
5+
F: Fn(),
6+
{
7+
f: F,
58
}
69

7-
impl Effect {
8-
pub fn new(f: impl Fn() + 'static) -> Rc<Self> {
9-
let e = Rc::new(Effect { f: Box::new(f) });
10+
impl<F> Effect<F>
11+
where
12+
F: Fn(),
13+
{
14+
#[allow(clippy::new_ret_no_self)]
15+
pub fn new(f: F) -> Rc<dyn IEffect>
16+
where
17+
F: 'static,
18+
{
19+
let e: Rc<dyn IEffect> = Rc::new(Effect { f });
1020

1121
crate::creating_effect_push(Rc::downgrade(&e));
1222
e.run();
1323
crate::creating_effect_pop();
1424

1525
e
1626
}
27+
}
28+
29+
pub trait IEffect {
30+
fn run(&self);
31+
}
1732

18-
pub(crate) fn run(&self) {
33+
impl<F> IEffect for Effect<F>
34+
where
35+
F: Fn(),
36+
{
37+
fn run(&self) {
1938
(self.f)()
2039
}
2140
}

cache/src/lib.rs

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

88
pub(crate) use cache::{remove_from_cache, store_in_cache, touch};
99
pub(crate) use call_stack::{creating_effect_peak, creating_effect_pop, creating_effect_push};
10-
pub use effect::Effect;
10+
pub use effect::{Effect, IEffect};
1111
pub use memo::Memo;
1212
pub use signal::Signal;
1313

cache/src/memo.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ use crate::{Observable, call_stack, remove_from_cache, store_in_cache, touch};
22

33
pub struct Memo<T, F>
44
where
5-
T: Clone,
65
F: Fn() -> T,
76
{
87
f: F,
@@ -11,7 +10,6 @@ where
1110

1211
impl<T, F> Observable for Memo<T, F>
1312
where
14-
T: Clone,
1513
F: Fn() -> T,
1614
{
1715
fn invalidate(&'static self) {
@@ -22,7 +20,6 @@ where
2220

2321
impl<T, F> Memo<T, F>
2422
where
25-
T: Clone,
2623
F: Fn() -> T,
2724
{
2825
pub fn new(f: F) -> Self {
@@ -32,7 +29,10 @@ where
3229
}
3330
}
3431

35-
pub fn get(&'static mut self) -> T {
32+
pub fn get(&'static mut self) -> T
33+
where
34+
T: Clone,
35+
{
3636
if let Some(last) = call_stack::last()
3737
&& !self.dependents.iter().any(|d| std::ptr::eq(*d, *last))
3838
{

cache/src/signal.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,15 @@ use std::{
33
rc::Weak,
44
};
55

6-
use crate::{Effect, Observable, call_stack};
6+
use crate::{IEffect, Observable, call_stack};
77

8-
pub struct Signal<T>
9-
where
10-
T: Eq + Default + 'static,
11-
{
8+
pub struct Signal<T> {
129
value: RefCell<T>,
1310
dependents: RefCell<Vec<&'static dyn Observable>>,
14-
effects: RefCell<Vec<Weak<Effect>>>,
11+
effects: RefCell<Vec<Weak<dyn IEffect>>>,
1512
}
1613

17-
impl<T> Signal<T>
18-
where
19-
T: Eq + Default + 'static,
20-
{
14+
impl<T> Signal<T> {
2115
fn invalidate(&self) {
2216
self.dependents.borrow().iter().for_each(|d| d.invalidate());
2317
}
@@ -43,7 +37,10 @@ where
4337
self.invalidate()
4438
}
4539

46-
pub fn new(value: Option<T>) -> Self {
40+
pub fn new(value: Option<T>) -> Self
41+
where
42+
T: Default,
43+
{
4744
Signal {
4845
value: value.unwrap_or_default().into(),
4946
dependents: vec![].into(),
@@ -71,7 +68,10 @@ where
7168
self.value.borrow()
7269
}
7370

74-
pub fn set(&self, value: T) -> bool {
71+
pub fn set(&self, value: T) -> bool
72+
where
73+
T: Eq,
74+
{
7575
if *self.value.borrow() == value {
7676
return false;
7777
}

0 commit comments

Comments
 (0)