11use std:: {
22 cell:: { Ref , RefCell } ,
3- rc:: Weak ,
3+ rc:: { Rc , Weak } ,
44} ;
55
66use 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/// ```
5662pub 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 ///
0 commit comments