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");