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.
This commit is contained in:
Jeremy Wall 2022-12-26 16:49:25 -05:00
parent 2349517a96
commit 3b220477d7
3 changed files with 12 additions and 7 deletions

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
/target /target
/Cargo.lock /Cargo.lock
.jj/

View File

@ -11,7 +11,7 @@
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
use std::marker::PhantomData; use std::{marker::PhantomData, rc::Rc};
use sycamore::prelude::*; use sycamore::prelude::*;
@ -53,11 +53,15 @@ where
self.signal self.signal
} }
pub fn bind_event<F>(&'ctx self, cx: Scope<'ctx>, message_fn: F) pub fn bind_trigger<F, Val>(
where &'ctx self,
F: Fn() -> Msg + 'ctx, cx: Scope<'ctx>,
trigger: &'ctx ReadSignal<Val>,
message_fn: F,
) where
F: Fn(Rc<Val>) -> Msg + 'ctx,
{ {
create_effect(cx, move || self.dispatch(message_fn())); create_effect(cx, move || self.dispatch(message_fn(trigger.get())));
} }
} }

View File

@ -65,7 +65,7 @@ fn test_state_effect_flow() {
create_child_scope(cx, |cx| { create_child_scope(cx, |cx| {
let form_val = create_signal(cx, handler.read_signal().get_untracked().value_one.clone()); 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()); form_val.set("bar".to_owned());
@ -74,7 +74,7 @@ fn test_state_effect_flow() {
create_child_scope(cx, |cx| { create_child_scope(cx, |cx| {
let form_val = create_signal(cx, 0); 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); form_val.set(1);
assert_eq!(handler.read_signal().get_untracked().value_two, 1); assert_eq!(handler.read_signal().get_untracked().value_two, 1);
}); });