use leptos::prelude::*;
pub trait SignalWatch {
type Value;
fn watch(&self, f: impl Fn(&Self::Value) + 'static) -> Box<dyn FnOnce()>;
}
impl<T, S> SignalWatch for RwSignal<T, S>
where
T: 'static,
S: Storage<ArcRwSignal<T>> + Storage<ArcReadSignal<T>>,
{
type Value = T;
fn watch(&self, f: impl Fn(&Self::Value) + 'static) -> Box<dyn FnOnce()> {
let signal = *self;
let effect = Effect::new(move |prev: Option<()>| {
signal.with(|value| {
if prev.is_some() {
untrack(|| f(value));
}
});
});
Box::new(move || {
effect.dispose();
})
}
}