sycamore_reactive/
utils.rs1use crate::*;
4
5pub trait Trackable {
9 fn _track(&self);
11}
12
13impl<T> Trackable for Signal<T> {
14 fn _track(&self) {
15 self.track();
16 }
17}
18
19impl<T> Trackable for ReadSignal<T> {
20 fn _track(&self) {
21 self.track();
22 }
23}
24
25macro_rules! impl_trackable_deps_for_tuple {
26 ($($T:tt),*) => {
27 paste::paste! {
28 impl<$($T,)*> Trackable for ($($T,)*)
29 where
30 $($T: Trackable,)*
31 {
32 fn _track(&self) {
33 let ($([<$T:lower>],)*) = self;
34 $(
35 [<$T:lower>]._track();
36 )*
37 }
38 }
39 }
40 }
41}
42
43impl_trackable_deps_for_tuple!(A);
44impl_trackable_deps_for_tuple!(A, B);
45impl_trackable_deps_for_tuple!(A, B, C);
46impl_trackable_deps_for_tuple!(A, B, C, D);
47impl_trackable_deps_for_tuple!(A, B, C, D, E);
48impl_trackable_deps_for_tuple!(A, B, C, D, E, F);
49impl_trackable_deps_for_tuple!(A, B, C, D, E, F, G);
50impl_trackable_deps_for_tuple!(A, B, C, D, E, F, G, H);
51impl_trackable_deps_for_tuple!(A, B, C, D, E, F, G, H, I);
52impl_trackable_deps_for_tuple!(A, B, C, D, E, F, G, H, I, J);
53impl_trackable_deps_for_tuple!(A, B, C, D, E, F, G, H, I, J, K);
54impl_trackable_deps_for_tuple!(A, B, C, D, E, F, G, H, I, J, K, L);
55
56pub fn on<T>(
79 deps: impl Trackable + 'static,
80 mut f: impl FnMut() -> T + 'static,
81) -> impl FnMut() -> T + 'static {
82 move || {
83 deps._track();
84 f()
85 }
86}