Skip to content

Commit 9903dcf

Browse files
authored
rename get update to DerivedRw (#697)
1 parent 10f0155 commit 9903dcf

File tree

5 files changed

+39
-18
lines changed

5 files changed

+39
-18
lines changed

Diff for: examples/timer/src/main.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::time::{Duration, Instant};
33
use floem::{
44
action::exec_after,
55
reactive::{
6-
create_effect, create_get_update, create_rw_signal, SignalGet, SignalTrack, SignalUpdate,
6+
create_effect, create_rw_signal, DerivedRwSignal, SignalGet, SignalTrack, SignalUpdate,
77
},
88
unit::{Pct, UnitExt},
99
views::{button, container, label, slider, stack, text, v_stack, Decorators},
@@ -47,7 +47,7 @@ fn app_view() -> impl IntoView {
4747
});
4848
});
4949

50-
let progress = create_get_update(
50+
let progress = DerivedRwSignal::new(
5151
target_duration,
5252
move |val| Pct(elapsed_time.get().as_secs_f64() / val.0 * 100.),
5353
|val| *val,

Diff for: examples/tokio-timer/src/main.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::time::Duration;
22

33
use floem::ext_event::create_signal_from_stream;
44
use floem::prelude::*;
5-
use floem::reactive::create_get_update;
5+
use floem::reactive::DerivedRwSignal;
66
use floem::unit::Pct;
77
use tokio::runtime::Runtime;
88
use tokio::time::Instant;
@@ -41,7 +41,7 @@ fn app_view() -> impl IntoView {
4141
)
4242
});
4343

44-
let progress = create_get_update(
44+
let progress = DerivedRwSignal::new(
4545
target_duration,
4646
move |val| Pct(elapsed_time().as_secs_f64() / val.0 * 100.),
4747
|val| *val,

Diff for: examples/widget-gallery/src/slider.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use floem::{
2-
reactive::{create_get_update, create_rw_signal, SignalGet},
2+
reactive::{create_rw_signal, DerivedRwSignal, SignalGet},
33
unit::UnitExt,
44
views::{label, slider, stack, text_input, Decorators},
55
IntoView,
@@ -9,7 +9,7 @@ use crate::form::{self, form_item};
99

1010
pub fn slider_view() -> impl IntoView {
1111
let input = create_rw_signal(String::from("50"));
12-
let slider_state = create_get_update(
12+
let slider_state = DerivedRwSignal::new(
1313
input,
1414
|val| val.parse::<f64>().unwrap_or_default().pct(),
1515
|val| val.0.to_string(),

Diff for: reactive/src/get_update_fn.rs renamed to reactive/src/derived.rs

+31-10
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,28 @@ use std::marker::PhantomData;
22

33
use crate::{read::SignalTrack, RwSignal, SignalGet, SignalUpdate, SignalWith};
44

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> {
611
signal: RwSignal<T>,
712
getter: RwSignal<Box<GF>>,
813
setter: RwSignal<Box<UF>>,
914
ty: PhantomData<T>,
1015
}
1116

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> {
1318
fn clone(&self) -> Self {
1419
*self
1520
}
1621
}
1722

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> {}
1924

2025
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>
2227
{
2328
fn id(&self) -> crate::id::Id {
2429
self.signal.id
@@ -48,7 +53,7 @@ impl<T: Clone + 'static, O: Clone, GF: Fn(&T) -> O + Copy, UF: Fn(&O) -> T + Cop
4853
}
4954

5055
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>
5257
{
5358
fn id(&self) -> crate::id::Id {
5459
self.signal.id
@@ -99,7 +104,7 @@ impl<T: Clone + 'static, O: Clone, GF: Fn(&T) -> O + Copy, UF: Fn(&O) -> T + Cop
99104
}
100105

101106
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>
103108
{
104109
fn id(&self) -> crate::id::Id {
105110
self.signal.id
@@ -116,7 +121,7 @@ impl<T: Clone + 'static, O: Clone, GF: Fn(&T) -> O + Copy, UF: Fn(&O) -> T + Cop
116121
}
117122

118123
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>
120125
{
121126
fn id(&self) -> crate::id::Id {
122127
self.signal.id
@@ -168,19 +173,35 @@ impl<T: 'static, O, GF: Fn(&T) -> O + Copy, UF: Fn(&O) -> T + Copy> SignalUpdate
168173
})
169174
}
170175
}
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+
}
171192

172-
pub fn create_get_update<T, O, GF, UF>(
193+
pub fn create_derived_rw_signal<T, O, GF, UF>(
173194
signal: RwSignal<T>,
174195
getter: GF,
175196
setter: UF,
176-
) -> GetUpdateFn<T, O, GF, UF>
197+
) -> DerivedRwSignal<T, O, GF, UF>
177198
where
178199
GF: Fn(&T) -> O + Clone + 'static,
179200
UF: Fn(&O) -> T + 'static,
180201
{
181202
let getter = RwSignal::new(Box::new(getter));
182203
let setter = RwSignal::new(Box::new(setter));
183-
GetUpdateFn {
204+
DerivedRwSignal {
184205
signal,
185206
getter,
186207
setter,

Diff for: reactive/src/lib.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
77
mod base;
88
mod context;
9+
mod derived;
910
mod effect;
10-
mod get_update_fn;
1111
mod id;
1212
mod impls;
1313
mod memo;
@@ -20,8 +20,8 @@ mod write;
2020

2121
pub use base::{create_base_signal, BaseSignal};
2222
pub use context::{provide_context, use_context};
23+
pub use derived::{create_derived_rw_signal, DerivedRwSignal};
2324
pub use effect::{batch, create_effect, create_stateful_updater, create_updater, untrack};
24-
pub use get_update_fn::{create_get_update, GetUpdateFn};
2525
pub use memo::{create_memo, Memo};
2626
pub use read::{ReadSignalValue, SignalGet, SignalRead, SignalTrack, SignalWith};
2727
pub use scope::{as_child_of_current_scope, with_scope, Scope};

0 commit comments

Comments
 (0)