reactive_signals/signals/types/
mod.rs

1//!
2//! Simple zero-cost abstractions that classifies signals based on the values they produce
3//!
4mod client;
5mod data;
6mod func;
7mod server;
8
9pub use client::*;
10pub use data::*;
11pub use func::*;
12pub use server::*;
13
14#[doc(hidden)]
15pub trait SignalType: 'static {
16    type Inner;
17
18    fn is_eq(&self, _other: &Self::Inner) -> bool {
19        false
20    }
21    fn opt_hash(&self) -> Option<u64> {
22        None
23    }
24
25    fn inner(&self) -> &Self::Inner;
26    fn inner_mut(&mut self) -> &mut Self::Inner;
27    fn new(value: Self::Inner) -> Self;
28}
29
30#[doc(hidden)]
31pub trait Modifiable {}
32
33#[doc(hidden)]
34pub trait Readable {}
35
36#[doc(hidden)]
37pub trait OptReadable {
38    const RUN_ON_SERVER: bool = true;
39    const RUN_ON_CLIENT: bool = true;
40}
41
42#[cfg(test)]
43fn set<T: 'static + SignalType>(val1: &T, val2: &T::Inner) -> bool {
44    val1.is_eq(&val2)
45}
46
47#[test]
48fn cmp_test() {
49    use crate::signals::{Data, EqData};
50
51    let d1 = Data(3);
52    let d2 = Data(2);
53
54    assert_eq!(set(&d1, &d2.inner()), false);
55    assert_eq!(set(&d1, &d1.inner()), false);
56
57    let d1 = EqData(3);
58    let d2 = EqData(2);
59
60    assert_eq!(set(&d1, &d2.inner()), false);
61    assert_eq!(set(&d1, &d1.inner()), true);
62}