reactive_signals/signals/kinds/
func.rs

1use crate::{
2    primitives::DynFunc,
3    runtimes::Runtime,
4    signals::{EqFunc, Func},
5    Scope, Signal,
6};
7
8pub trait EqFuncKind {
9    #[inline]
10    fn signal_kind(&self) -> EqFuncSignal {
11        EqFuncSignal
12    }
13}
14
15// Does not require any autoref if called as (&error).datakind().
16impl<F, T, RT: Runtime> EqFuncKind for (Scope<RT>, F)
17where
18    F: Fn() -> T + 'static,
19    T: PartialEq + 'static,
20{
21}
22
23pub trait TrueFuncKind {
24    #[inline]
25    fn signal_kind(&self) -> TrueFunc {
26        TrueFunc
27    }
28}
29
30// Requires one extra autoref to call! Lower priority than EqKind.
31impl<F, T, RT: Runtime> TrueFuncKind for &(Scope<RT>, F)
32where
33    F: Fn() -> T + 'static,
34    T: 'static,
35{
36}
37
38pub struct EqFuncSignal;
39
40impl EqFuncSignal {
41    #[inline]
42    pub fn new<F, T, RT: Runtime>(self, tuple: (Scope<RT>, F)) -> Signal<EqFunc<T>, RT>
43    where
44        F: Fn() -> T + 'static,
45        T: PartialEq + 'static,
46    {
47        let (sx, func) = tuple;
48        Signal::func(sx, || DynFunc::new::<F, T, EqFunc<T>>(func))
49    }
50}
51pub struct TrueFunc;
52
53impl TrueFunc {
54    #[inline]
55    pub fn new<F, T, RT: Runtime>(self, tuple: (Scope<RT>, F)) -> Signal<Func<T>, RT>
56    where
57        F: Fn() -> T + 'static,
58        T: 'static,
59    {
60        let (sx, func) = tuple;
61        Signal::func(sx, || DynFunc::new::<F, T, Func<T>>(func))
62    }
63}