@@ -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 }
0 commit comments