Skip to content

Commit c5a61f6

Browse files
committed
refactor(cache): wrap Signal class with Rc to unify API, and remove unnecessary Option wrapper in Signal class
1 parent 702864a commit c5a61f6

File tree

4 files changed

+42
-40
lines changed

4 files changed

+42
-40
lines changed

cache/src/effect.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ use crate::effect_stack::{effect_peak, effect_pop, effect_push};
4646
/// run_count: Rc<Cell<u32>>,
4747
/// }
4848
///
49-
/// let counter = Rc::new(Signal::new(Some(1)));
49+
/// let counter = Signal::new(1);
5050
/// let double = Memo::new({
5151
/// let counter = counter.clone();
5252
/// move || *counter.get() * 2
@@ -114,7 +114,7 @@ impl Effect {
114114
/// effect: Rc<Effect>,
115115
/// }
116116
///
117-
/// let counter = Rc::new(Signal::new(Some(1)));
117+
/// let counter = Signal::new(1);
118118
/// let double = Memo::new({
119119
/// let counter = counter.clone();
120120
/// move || *counter.get() * 2

cache/src/memo.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use crate::{IObservable, memo_stack, store_in_cache, touch};
2626
/// use std::rc::Rc;
2727
/// use reactive_cache::{Signal, Memo};
2828
///
29-
/// let counter = Rc::new(Signal::new(Some(1)));
29+
/// let counter = Signal::new(1);
3030
/// let double = {
3131
/// let counter = Rc::clone(&counter);
3232
/// Memo::new({
@@ -50,7 +50,7 @@ use crate::{IObservable, memo_stack, store_in_cache, touch};
5050
/// double: Rc<Memo<i32>>,
5151
/// }
5252
///
53-
/// let counter = Rc::new(Signal::new(Some(1)));
53+
/// let counter = Signal::new(1);
5454
/// let double = Memo::new({
5555
/// let counter = counter.clone();
5656
/// move || *counter.get() * 2
@@ -99,8 +99,8 @@ impl<T> Memo<T> {
9999
/// }
100100
///
101101
/// // Construct signals
102-
/// let a = Rc::new(Signal::new(Some(2)));
103-
/// let b = Rc::new(Signal::new(Some(3)));
102+
/// let a = Signal::new(2);
103+
/// let b = Signal::new(3);
104104
///
105105
/// // Construct a memo depending on `a` and `b`
106106
/// let sum = {

cache/src/signal.rs

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

66
use crate::{Effect, IMemo, IObservable, effect_stack::EffectStackEntry};
@@ -19,39 +19,45 @@ use crate::{Effect, IMemo, IObservable, effect_stack::EffectStackEntry};
1919
///
2020
/// # Type Parameters
2121
///
22-
/// - `T`: The type of the value stored in the signal. Must implement `Eq + Default`.
22+
/// - `T`: The type of the value stored in the signal. Must implement `Eq`.
2323
///
2424
/// # Examples
2525
///
2626
/// ## Basic usage
2727
/// ```
2828
/// use std::rc::Rc;
29-
/// use std::cell::Cell;
3029
/// use reactive_cache::Signal;
3130
///
32-
/// let signal = Signal::new(Some(10));
31+
/// let signal = Signal::new(10);
3332
/// assert_eq!(*signal.get(), 10);
3433
///
35-
/// let default_signal: Signal<i32> = Signal::new(None);
36-
/// assert_eq!(*default_signal.get(), 0);
34+
/// signal.set(20);
35+
/// assert_eq!(*signal.get(), 20);
3736
/// ```
3837
///
3938
/// ## Using inside a struct
4039
/// ```
41-
/// use std::{rc::Rc, cell::Cell};
40+
/// use std::rc::Rc;
4241
/// use reactive_cache::Signal;
4342
///
4443
/// struct ViewModel {
45-
/// counter: Signal<i32>,
46-
/// sum: Signal<i32>,
44+
/// counter: Rc<Signal<i32>>,
45+
/// name: Rc<Signal<String>>,
4746
/// }
4847
///
49-
/// let counter = Signal::new(Some(5));
50-
/// let sum = Signal::new(None);
51-
/// let vm = ViewModel { counter, sum };
48+
/// let vm = ViewModel {
49+
/// counter: Signal::new(0).into(),
50+
/// name: Signal::new("Alice".to_string()).into(),
51+
/// };
52+
///
53+
/// assert_eq!(*vm.counter.get(), 0);
54+
/// assert_eq!(*vm.name.get(), "Alice");
55+
///
56+
/// vm.counter.set(1);
57+
/// vm.name.set("Bob".into());
5258
///
53-
/// assert_eq!(*vm.counter.get(), 5);
54-
/// assert_eq!(*vm.sum.get(), 0);
59+
/// assert_eq!(*vm.counter.get(), 1);
60+
/// assert_eq!(*vm.name.get(), "Bob");
5561
/// ```
5662
pub struct Signal<T> {
5763
value: RefCell<T>,
@@ -92,33 +98,30 @@ impl<T> Signal<T> {
9298

9399
/// Creates a new `Signal` with the given initial value.
94100
///
95-
/// If `None` is provided, `T::default()` is used.
96-
///
97101
/// # Examples
98102
///
99103
/// Basic usage:
100104
/// ```
105+
/// use std::rc::Rc;
101106
/// use reactive_cache::Signal;
102107
///
103-
/// let signal = Signal::new(Some(10));
108+
/// let signal = Signal::new(10);
104109
/// assert_eq!(*signal.get(), 10);
105-
///
106-
/// let default_signal: Signal<i32> = Signal::new(None);
107-
/// assert_eq!(*default_signal.get(), 0);
108110
/// ```
109111
///
110112
/// Using inside a struct:
111113
/// ```
114+
/// use std::rc::Rc;
112115
/// use reactive_cache::Signal;
113116
///
114117
/// struct ViewModel {
115-
/// counter: Signal<i32>,
116-
/// name: Signal<String>,
118+
/// counter: Rc<Signal<i32>>,
119+
/// name: Rc<Signal<String>>,
117120
/// }
118121
///
119122
/// let vm = ViewModel {
120-
/// counter: Signal::new(Some(0)),
121-
/// name: Signal::new(Some("Alice".to_string())),
123+
/// counter: Signal::new(0),
124+
/// name: Signal::new("Alice".to_string()),
122125
/// };
123126
///
124127
/// assert_eq!(*vm.counter.get(), 0);
@@ -131,15 +134,14 @@ impl<T> Signal<T> {
131134
/// assert_eq!(*vm.counter.get(), 1);
132135
/// assert_eq!(*vm.name.get(), "Bob");
133136
/// ```
134-
pub fn new(value: Option<T>) -> Self
135-
where
136-
T: Default,
137+
pub fn new(value: T) -> Rc<Self>
137138
{
138139
Signal {
139-
value: value.unwrap_or_default().into(),
140+
value: value.into(),
140141
dependents: vec![].into(),
141142
effects: vec![].into(),
142143
}
144+
.into()
143145
}
144146

145147
/// Gets a reference to the current value, tracking dependencies
@@ -150,7 +152,7 @@ impl<T> Signal<T> {
150152
/// ```
151153
/// use reactive_cache::Signal;
152154
///
153-
/// let signal = Signal::new(Some(42));
155+
/// let signal = Signal::new(42);
154156
/// assert_eq!(*signal.get(), 42);
155157
/// ```
156158
pub fn get(&self) -> Ref<'_, T> {
@@ -180,7 +182,7 @@ impl<T> Signal<T> {
180182
/// ```
181183
/// use reactive_cache::Signal;
182184
///
183-
/// let signal = Signal::new(Some(5));
185+
/// let signal = Signal::new(5);
184186
/// assert_eq!(signal.set(10), true);
185187
/// assert_eq!(*signal.get(), 10);
186188
///

macros/src/lib.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use syn::{Ident, ItemFn, ItemStatic, ReturnType, parse_macro_input};
1616
/// # Requirements
1717
///
1818
/// - The macro currently supports only `static mut` variables.
19-
/// - The variable type must implement `Eq + Default`.
19+
/// - The variable type must implement `Eq`.
2020
///
2121
/// # Examples
2222
///
@@ -79,8 +79,8 @@ pub fn ref_signal(input: TokenStream) -> TokenStream {
7979
let ident_get = format_ident!("{}_get", ident);
8080
let ident_set = format_ident!("{}_set", ident);
8181

82-
let lazy_ty = quote! { reactive_cache::Lazy<reactive_cache::Signal<#ty>> };
83-
let expr = quote! { reactive_cache::Lazy::new(|| reactive_cache::Signal::new(Some(#expr))) };
82+
let lazy_ty = quote! { reactive_cache::Lazy<std::rc::Rc<reactive_cache::Signal<#ty>>> };
83+
let expr = quote! { reactive_cache::Lazy::new(|| reactive_cache::Signal::new(#expr)) };
8484

8585
let expanded = quote! {
8686
#(#attrs)*
@@ -114,7 +114,7 @@ pub fn ref_signal(input: TokenStream) -> TokenStream {
114114
/// # Requirements
115115
///
116116
/// - The macro currently supports only `static mut` variables.
117-
/// - The variable type must implement `Eq + Default`.
117+
/// - The variable type must implement `Eq`.
118118
///
119119
/// # Examples
120120
///

0 commit comments

Comments
 (0)