Skip to content

Commit 69441e4

Browse files
committed
1. Added a trait for Signal setter, automatically compatible with both T: Eq and T: !Eq cases.
2. Introduces a prelude module to simplify imports for common types.
1 parent fdef2e9 commit 69441e4

File tree

9 files changed

+74
-22
lines changed

9 files changed

+74
-22
lines changed

cache/src/effect.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use crate::effect_stack::{effect_peak, effect_pop, effect_push};
2121
/// ## Basic usage
2222
/// ```
2323
/// use std::{cell::Cell, rc::Rc};
24-
/// use reactive_cache::Effect;
24+
/// use reactive_cache::prelude::*;
2525
///
2626
/// let counter = Rc::new(Cell::new(0));
2727
/// let c_clone = counter.clone();
@@ -37,7 +37,7 @@ use crate::effect_stack::{effect_peak, effect_pop, effect_push};
3737
/// ## Using inside a struct
3838
/// ```
3939
/// use std::{rc::Rc, cell::Cell};
40-
/// use reactive_cache::{Signal, Memo, Effect};
40+
/// use reactive_cache::prelude::*;
4141
///
4242
/// struct ViewModel {
4343
/// counter: Rc<Signal<i32>>,
@@ -90,7 +90,7 @@ impl Effect {
9090
/// ## Basic usage
9191
/// ```
9292
/// use std::{cell::Cell, rc::Rc};
93-
/// use reactive_cache::Effect;
93+
/// use reactive_cache::prelude::*;
9494
///
9595
/// let counter = Rc::new(Cell::new(0));
9696
/// let c_clone = counter.clone();
@@ -106,7 +106,7 @@ impl Effect {
106106
/// ## Using inside a struct
107107
/// ```
108108
/// use std::rc::Rc;
109-
/// use reactive_cache::{Signal, Memo, Effect};
109+
/// use reactive_cache::prelude::*;
110110
///
111111
/// struct ViewModel {
112112
/// counter: Rc<Signal<i32>>,
@@ -165,7 +165,7 @@ impl Effect {
165165
///
166166
/// ```
167167
/// use std::{cell::Cell, rc::Rc};
168-
/// use reactive_cache::Effect;
168+
/// use reactive_cache::prelude::*;
169169
/// use reactive_macros::signal;
170170
///
171171
/// signal!(static mut FLAG: bool = true;);

cache/src/lib.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
#![allow(incomplete_features)]
2+
#![feature(specialization)]
3+
14
pub(crate) mod cache;
25
pub(crate) mod effect_stack;
36
pub(crate) mod memo_stack;
@@ -13,10 +16,17 @@ pub use effect::Effect;
1316
pub(crate) use memo::IMemo;
1417
pub use memo::Memo;
1518
pub(crate) use observable::IObservable;
16-
pub use signal::Signal;
19+
pub use signal::{Signal, SignalSetter};
1720

1821
pub use once_cell::unsync::Lazy;
1922

23+
pub mod prelude {
24+
pub use crate::Effect;
25+
pub use crate::Memo;
26+
pub use crate::Signal;
27+
pub use crate::SignalSetter as _;
28+
}
29+
2030
#[cfg(feature = "macros")]
2131
#[cfg_attr(docsrs, doc(cfg(feature = "macros")))]
2232
pub use reactive_macros::*;

cache/src/macros.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
/// ```rust
2828
/// use std::{cell::Cell, rc::Rc};
2929
/// use reactive_cache::effect;
30+
/// use reactive_cache::prelude::*;
3031
/// use reactive_macros::signal;
3132
///
3233
/// signal!(static mut A: i32 = 1;);
@@ -83,9 +84,9 @@
8384
#[macro_export]
8485
macro_rules! effect {
8586
($f:expr) => {
86-
reactive_cache::Effect::new($f)
87+
$crate::Effect::new($f)
8788
};
8889
($f:expr, $f2:expr) => {
89-
reactive_cache::Effect::new_with_deps($f, $f2)
90+
$crate::Effect::new_with_deps($f, $f2)
9091
};
9192
}

cache/src/memo.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ use crate::{IObservable, memo_stack, store_in_cache, touch};
3232
/// ## Basic usage
3333
/// ```
3434
/// use std::rc::Rc;
35-
/// use reactive_cache::{Signal, Memo};
35+
/// use reactive_cache::prelude::*;
3636
///
3737
/// let counter = Signal::new(1);
3838
/// let double = {
@@ -51,7 +51,7 @@ use crate::{IObservable, memo_stack, store_in_cache, touch};
5151
/// ## Using inside a struct
5252
/// ```
5353
/// use std::rc::Rc;
54-
/// use reactive_cache::{Signal, Memo};
54+
/// use reactive_cache::prelude::*;
5555
///
5656
/// struct ViewModel {
5757
/// counter: Rc<Signal<i32>>,
@@ -98,7 +98,7 @@ impl<T> Memo<T> {
9898
/// ```
9999
/// use std::rc::Rc;
100100
///
101-
/// use reactive_cache::{Signal, Memo};
101+
/// use reactive_cache::prelude::*;
102102
///
103103
/// struct ViewModel {
104104
/// a: Rc<Signal<i32>>,

cache/src/signal.rs

Lines changed: 46 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ use crate::{Effect, IMemo, IObservable, effect_stack::EffectStackEntry};
3434
/// ## Basic usage
3535
/// ```
3636
/// use std::rc::Rc;
37-
/// use reactive_cache::Signal;
37+
/// use reactive_cache::prelude::*;
3838
///
3939
/// let signal = Signal::new(10);
4040
/// assert_eq!(*signal.get(), 10);
@@ -46,7 +46,7 @@ use crate::{Effect, IMemo, IObservable, effect_stack::EffectStackEntry};
4646
/// ## Using inside a struct
4747
/// ```
4848
/// use std::rc::Rc;
49-
/// use reactive_cache::Signal;
49+
/// use reactive_cache::prelude::*;
5050
///
5151
/// struct ViewModel {
5252
/// counter: Rc<Signal<i32>>,
@@ -128,7 +128,7 @@ impl<T> Signal<T> {
128128
/// Basic usage:
129129
/// ```
130130
/// use std::rc::Rc;
131-
/// use reactive_cache::Signal;
131+
/// use reactive_cache::prelude::*;
132132
///
133133
/// let signal = Signal::new(10);
134134
/// assert_eq!(*signal.get(), 10);
@@ -137,7 +137,7 @@ impl<T> Signal<T> {
137137
/// Using inside a struct:
138138
/// ```
139139
/// use std::rc::Rc;
140-
/// use reactive_cache::Signal;
140+
/// use reactive_cache::prelude::*;
141141
///
142142
/// struct ViewModel {
143143
/// counter: Rc<Signal<i32>>,
@@ -174,7 +174,7 @@ impl<T> Signal<T> {
174174
/// # Examples
175175
///
176176
/// ```
177-
/// use reactive_cache::Signal;
177+
/// use reactive_cache::prelude::*;
178178
///
179179
/// let signal = Signal::new(42);
180180
/// assert_eq!(*signal.get(), 42);
@@ -195,7 +195,46 @@ impl<T> Signal<T> {
195195

196196
self.value.borrow()
197197
}
198+
}
199+
200+
pub trait SignalSetter<T> {
201+
fn set(&self, value: T) -> bool;
202+
}
203+
204+
impl<T> SignalSetter<T> for Signal<T> {
205+
/// Sets the value of the signal.
206+
///
207+
/// For generic types `T` that do not support comparison, they are treated as
208+
/// always changing, so the value is always set and `true` is always returned.
209+
/// All dependent memos are invalidated and dependent effects were triggered.
210+
///
211+
/// # Examples
212+
///
213+
/// ```
214+
/// use reactive_cache::prelude::*;
215+
///
216+
/// #[derive(Debug)]
217+
/// struct Num(i32);
218+
///
219+
/// let signal = Signal::new(Num(5));
220+
/// assert_eq!(signal.set(Num(10)), true);
221+
/// assert_eq!(signal.get().0, 10);
222+
///
223+
/// // Setting to the same value always return true and trigger all effects.
224+
/// assert_eq!(signal.set(Num(10)), true);
225+
/// ```
226+
default fn set(&self, value: T) -> bool {
227+
self.OnPropertyChanging();
228+
229+
*self.value.borrow_mut() = value;
230+
231+
self.OnPropertyChanged();
232+
233+
true
234+
}
235+
}
198236

237+
impl<T: Eq> SignalSetter<T> for Signal<T> {
199238
/// Sets the value of the signal.
200239
///
201240
/// Returns `true` if the value changed, all dependent memos are
@@ -204,7 +243,7 @@ impl<T> Signal<T> {
204243
/// # Examples
205244
///
206245
/// ```
207-
/// use reactive_cache::Signal;
246+
/// use reactive_cache::prelude::*;
208247
///
209248
/// let signal = Signal::new(5);
210249
/// assert_eq!(signal.set(10), true);
@@ -213,10 +252,7 @@ impl<T> Signal<T> {
213252
/// // Setting to the same value returns false
214253
/// assert_eq!(signal.set(10), false);
215254
/// ```
216-
pub fn set(&self, value: T) -> bool
217-
where
218-
T: Eq,
219-
{
255+
fn set(&self, value: T) -> bool {
220256
if *self.value.borrow() == value {
221257
return false;
222258
}

macros/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use syn::{Ident, ItemFn, ItemStatic, ReturnType, parse_macro_input};
1616
/// # Examples
1717
///
1818
/// ```rust
19+
/// use reactive_cache::prelude::*;
1920
/// use reactive_macros::signal;
2021
///
2122
/// signal!(static mut A: i32 = 10;);
@@ -90,6 +91,7 @@ pub fn signal(input: TokenStream) -> TokenStream {
9091
/// # Examples
9192
///
9293
/// ```rust
94+
/// use reactive_cache::prelude::*;
9395
/// use reactive_macros::memo;
9496
///
9597
/// #[memo]
@@ -180,6 +182,7 @@ pub fn memo(_attr: TokenStream, item: TokenStream) -> TokenStream {
180182
/// # Examples
181183
///
182184
/// ```rust
185+
/// use reactive_cache::prelude::*;
183186
/// use reactive_macros::evaluate;
184187
///
185188
/// fn print(msg: String) {

macros/tests/dep.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
use std::cell::Cell;
44

5+
use reactive_cache::prelude::*;
56
use reactive_macros::{memo, signal};
67

78
thread_local! {

macros/tests/effect.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
use std::{cell::Cell, rc::Rc};
44

55
use reactive_cache::effect;
6+
use reactive_cache::prelude::*;
67
use reactive_macros::{memo, signal};
78

89
static mut SOURCE_A_CALLED: i32 = 0;

macros/tests/integration.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::{
33
rc::{Rc, Weak},
44
};
55

6-
use reactive_cache::{Effect, Memo, Signal};
6+
use reactive_cache::prelude::*;
77
use reactive_macros::{memo, signal};
88

99
// ----------------------

0 commit comments

Comments
 (0)