floem_reactive/
base.rs

1use std::marker::PhantomData;
2
3use crate::{
4    id::Id,
5    signal::{NotThreadSafe, Signal},
6    ReadSignal, RwSignal, SignalGet, SignalUpdate, SignalWith, WriteSignal,
7};
8
9/// BaseSignal gives you another way to control the lifetime of a Signal
10/// apart from Scope.
11///
12/// When BaseSignal is dropped, it will dispose the underlying Signal as well.
13/// The signal isn't put in any Scope when a BaseSignal is created, so that
14/// the lifetime of the signal can only be determined by BaseSignal rather than
15/// Scope dependencies
16pub struct BaseSignal<T> {
17    id: Id,
18    ty: PhantomData<T>,
19    pub(crate) ts: PhantomData<NotThreadSafe>,
20}
21
22impl<T> Eq for BaseSignal<T> {}
23
24impl<T> PartialEq for BaseSignal<T> {
25    fn eq(&self, other: &Self) -> bool {
26        self.id == other.id
27    }
28}
29
30impl<T> Drop for BaseSignal<T> {
31    fn drop(&mut self) {
32        self.id.dispose();
33    }
34}
35
36pub fn create_base_signal<T: 'static>(value: T) -> BaseSignal<T> {
37    let id = Signal::create(value);
38    BaseSignal {
39        id,
40        ty: PhantomData,
41        ts: PhantomData,
42    }
43}
44
45impl<T> BaseSignal<T> {
46    /// Create a RwSignal of this Signal
47    pub fn rw(&self) -> RwSignal<T> {
48        RwSignal {
49            id: self.id,
50            ty: PhantomData,
51            ts: PhantomData,
52        }
53    }
54
55    /// Create a Getter of this Signal
56    pub fn read_only(&self) -> ReadSignal<T> {
57        ReadSignal {
58            id: self.id,
59            ty: PhantomData,
60            ts: PhantomData,
61        }
62    }
63
64    /// Create a Setter of this Signal
65    pub fn write_only(&self) -> WriteSignal<T> {
66        WriteSignal {
67            id: self.id,
68            ty: PhantomData,
69            ts: PhantomData,
70        }
71    }
72}
73
74impl<T: Clone> SignalGet<T> for BaseSignal<T> {
75    fn id(&self) -> Id {
76        self.id
77    }
78}
79
80impl<T> SignalWith<T> for BaseSignal<T> {
81    fn id(&self) -> Id {
82        self.id
83    }
84}
85
86impl<T> SignalUpdate<T> for BaseSignal<T> {
87    fn id(&self) -> Id {
88        self.id
89    }
90}