From 3b220477d7648a5aa016eba5d7d3faf6c6f5cb88 Mon Sep 17 00:00:00 2001 From: Jeremy Wall Date: Mon, 26 Dec 2022 16:49:25 -0500 Subject: [PATCH] Improve the type safety and ergonomics of bind_event. * Add the triggering signal as a parameter. This ensures that We always call get on the signal to trigger the effect. * Rename the method to bind_trigger to better reflect what it is doing. --- .gitignore | 1 + src/lib.rs | 14 +++++++++----- src/tests/mod.rs | 4 ++-- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 4fffb2f..183ea7d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /target /Cargo.lock +.jj/ \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 458a637..b73d172 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,7 +11,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -use std::marker::PhantomData; +use std::{marker::PhantomData, rc::Rc}; use sycamore::prelude::*; @@ -53,11 +53,15 @@ where self.signal } - pub fn bind_event(&'ctx self, cx: Scope<'ctx>, message_fn: F) - where - F: Fn() -> Msg + 'ctx, + pub fn bind_trigger( + &'ctx self, + cx: Scope<'ctx>, + trigger: &'ctx ReadSignal, + message_fn: F, + ) where + F: Fn(Rc) -> Msg + 'ctx, { - create_effect(cx, move || self.dispatch(message_fn())); + create_effect(cx, move || self.dispatch(message_fn(trigger.get()))); } } diff --git a/src/tests/mod.rs b/src/tests/mod.rs index df39f3c..8c85cc5 100644 --- a/src/tests/mod.rs +++ b/src/tests/mod.rs @@ -65,7 +65,7 @@ fn test_state_effect_flow() { create_child_scope(cx, |cx| { let form_val = create_signal(cx, handler.read_signal().get_untracked().value_one.clone()); - handler.bind_event(cx, || Msg::UpdateOne((*form_val.get()).clone())); + handler.bind_trigger(cx, form_val, |val| Msg::UpdateOne((*val).clone())); form_val.set("bar".to_owned()); @@ -74,7 +74,7 @@ fn test_state_effect_flow() { create_child_scope(cx, |cx| { let form_val = create_signal(cx, 0); - handler.bind_event(cx, || Msg::UpdateTwo(*form_val.get())); + handler.bind_trigger(cx, form_val, |val| Msg::UpdateTwo(*val)); form_val.set(1); assert_eq!(handler.read_signal().get_untracked().value_two, 1); });