From 26a07dde6d7ae25ce330737b583d2bfb22115306 Mon Sep 17 00:00:00 2001 From: Filipe Rodrigues Date: Tue, 27 Feb 2024 18:49:29 +0000 Subject: [PATCH] `IntoSubscriber` is now implemented for all effects and weak effects. --- dynatos-reactive/src/lib.rs | 15 +++++++++++---- dynatos-reactive/src/trigger.rs | 4 ++-- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/dynatos-reactive/src/lib.rs b/dynatos-reactive/src/lib.rs index 14dca99..c3e0051 100644 --- a/dynatos-reactive/src/lib.rs +++ b/dynatos-reactive/src/lib.rs @@ -19,6 +19,9 @@ pub use self::{ with_default::{SignalWithDefault, WithDefault}, }; +// Imports +use std::marker::Unsize; + /// Signal get #[extend::ext(name = SignalGet)] pub impl S @@ -81,16 +84,20 @@ pub trait SignalUpdate { /// Types that may be converted into a subscriber pub trait IntoSubscriber { + /// Converts this type into a weak effect. fn into_subscriber(self) -> WeakEffect; } #[duplicate::duplicate_item( T body; - [ Effect ] [ self.downgrade() ]; - [ &'_ Effect ] [ self.downgrade() ]; - [ WeakEffect ] [ self ]; + [ Effect ] [ self.downgrade() ]; + [ &'_ Effect ] [ self.downgrade() ]; + [ WeakEffect ] [ self ]; )] -impl IntoSubscriber for T { +impl IntoSubscriber for T +where + F: ?Sized + Fn() + Unsize + 'static, +{ fn into_subscriber(self) -> WeakEffect { body } diff --git a/dynatos-reactive/src/trigger.rs b/dynatos-reactive/src/trigger.rs index d08db53..829fbb5 100644 --- a/dynatos-reactive/src/trigger.rs +++ b/dynatos-reactive/src/trigger.rs @@ -112,7 +112,7 @@ mod test { // Then create the trigger, and ensure it wasn't triggered // by just creating it and adding the subscriber let trigger = Trigger::new(); - trigger.add_subscriber(effect.downgrade() as WeakEffect); + trigger.add_subscriber(&effect); assert_eq!(TRIGGERS.get(), 1, "Trigger was triggered early"); // Then trigger and ensure it was triggered @@ -120,7 +120,7 @@ mod test { assert_eq!(TRIGGERS.get(), 2, "Trigger was not triggered"); // Then add the subscriber again and ensure the effect isn't run twice - trigger.add_subscriber(effect.downgrade() as WeakEffect); + trigger.add_subscriber(&effect); trigger.trigger(); assert_eq!(TRIGGERS.get(), 3, "Trigger ran effect multiple times");