@@ -2,23 +2,28 @@ use std::marker::PhantomData;
2
2
3
3
use crate :: { read:: SignalTrack , RwSignal , SignalGet , SignalUpdate , SignalWith } ;
4
4
5
- pub struct GetUpdateFn < T , O , GF : Fn ( & T ) -> O + Clone + ' static , UF : Fn ( & O ) -> T + ' static > {
5
+ /// A signal that is derived from an [RwSignal](super::RwSignal) but lets you specify getters and setters for the signal.
6
+ ///
7
+ /// This is useful when you want a single state variable and don't want to use effects to synchronize multiple signals.
8
+ ///
9
+ /// This is also useful when you want a derived signal that implements the [SignalGet], [SignalWith], etc. traits.
10
+ pub struct DerivedRwSignal < T , O , GF : Fn ( & T ) -> O + Clone + ' static , UF : Fn ( & O ) -> T + ' static > {
6
11
signal : RwSignal < T > ,
7
12
getter : RwSignal < Box < GF > > ,
8
13
setter : RwSignal < Box < UF > > ,
9
14
ty : PhantomData < T > ,
10
15
}
11
16
12
- impl < T , O , GF : Fn ( & T ) -> O + Copy , UF : Fn ( & O ) -> T + Copy > Clone for GetUpdateFn < T , O , GF , UF > {
17
+ impl < T , O , GF : Fn ( & T ) -> O + Copy , UF : Fn ( & O ) -> T + Copy > Clone for DerivedRwSignal < T , O , GF , UF > {
13
18
fn clone ( & self ) -> Self {
14
19
* self
15
20
}
16
21
}
17
22
18
- impl < T , O , GF : Fn ( & T ) -> O + Copy , UF : Fn ( & O ) -> T + Copy > Copy for GetUpdateFn < T , O , GF , UF > { }
23
+ impl < T , O , GF : Fn ( & T ) -> O + Copy , UF : Fn ( & O ) -> T + Copy > Copy for DerivedRwSignal < T , O , GF , UF > { }
19
24
20
25
impl < T : Clone + ' static , O : Clone , GF : Fn ( & T ) -> O + Copy , UF : Fn ( & O ) -> T + Copy > SignalGet < O >
21
- for GetUpdateFn < T , O , GF , UF >
26
+ for DerivedRwSignal < T , O , GF , UF >
22
27
{
23
28
fn id ( & self ) -> crate :: id:: Id {
24
29
self . signal . id
@@ -48,7 +53,7 @@ impl<T: Clone + 'static, O: Clone, GF: Fn(&T) -> O + Copy, UF: Fn(&O) -> T + Cop
48
53
}
49
54
50
55
impl < T : Clone + ' static , O : Clone , GF : Fn ( & T ) -> O + Copy , UF : Fn ( & O ) -> T + Copy > SignalWith < O >
51
- for GetUpdateFn < T , O , GF , UF >
56
+ for DerivedRwSignal < T , O , GF , UF >
52
57
{
53
58
fn id ( & self ) -> crate :: id:: Id {
54
59
self . signal . id
@@ -99,7 +104,7 @@ impl<T: Clone + 'static, O: Clone, GF: Fn(&T) -> O + Copy, UF: Fn(&O) -> T + Cop
99
104
}
100
105
101
106
impl < T : Clone + ' static , O : Clone , GF : Fn ( & T ) -> O + Copy , UF : Fn ( & O ) -> T + Copy > SignalTrack < O >
102
- for GetUpdateFn < T , O , GF , UF >
107
+ for DerivedRwSignal < T , O , GF , UF >
103
108
{
104
109
fn id ( & self ) -> crate :: id:: Id {
105
110
self . signal . id
@@ -116,7 +121,7 @@ impl<T: Clone + 'static, O: Clone, GF: Fn(&T) -> O + Copy, UF: Fn(&O) -> T + Cop
116
121
}
117
122
118
123
impl < T : ' static , O , GF : Fn ( & T ) -> O + Copy , UF : Fn ( & O ) -> T + Copy > SignalUpdate < O >
119
- for GetUpdateFn < T , O , GF , UF >
124
+ for DerivedRwSignal < T , O , GF , UF >
120
125
{
121
126
fn id ( & self ) -> crate :: id:: Id {
122
127
self . signal . id
@@ -168,19 +173,35 @@ impl<T: 'static, O, GF: Fn(&T) -> O + Copy, UF: Fn(&O) -> T + Copy> SignalUpdate
168
173
} )
169
174
}
170
175
}
176
+ impl < T , O , GF , UF > DerivedRwSignal < T , O , GF , UF >
177
+ where
178
+ GF : Fn ( & T ) -> O + Clone + ' static ,
179
+ UF : Fn ( & O ) -> T + ' static ,
180
+ {
181
+ pub fn new ( signal : RwSignal < T > , getter : GF , setter : UF ) -> Self {
182
+ let getter = RwSignal :: new ( Box :: new ( getter) ) ;
183
+ let setter = RwSignal :: new ( Box :: new ( setter) ) ;
184
+ DerivedRwSignal {
185
+ signal,
186
+ getter,
187
+ setter,
188
+ ty : PhantomData ,
189
+ }
190
+ }
191
+ }
171
192
172
- pub fn create_get_update < T , O , GF , UF > (
193
+ pub fn create_derived_rw_signal < T , O , GF , UF > (
173
194
signal : RwSignal < T > ,
174
195
getter : GF ,
175
196
setter : UF ,
176
- ) -> GetUpdateFn < T , O , GF , UF >
197
+ ) -> DerivedRwSignal < T , O , GF , UF >
177
198
where
178
199
GF : Fn ( & T ) -> O + Clone + ' static ,
179
200
UF : Fn ( & O ) -> T + ' static ,
180
201
{
181
202
let getter = RwSignal :: new ( Box :: new ( getter) ) ;
182
203
let setter = RwSignal :: new ( Box :: new ( setter) ) ;
183
- GetUpdateFn {
204
+ DerivedRwSignal {
184
205
signal,
185
206
getter,
186
207
setter,
0 commit comments