1use std::marker::PhantomData;
2
3use crate::{
4 id::Id,
5 signal::{NotThreadSafe, Signal},
6 ReadSignal, RwSignal, SignalGet, SignalUpdate, SignalWith, WriteSignal,
7};
8
9pub 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 pub fn rw(&self) -> RwSignal<T> {
48 RwSignal {
49 id: self.id,
50 ty: PhantomData,
51 ts: PhantomData,
52 }
53 }
54
55 pub fn read_only(&self) -> ReadSignal<T> {
57 ReadSignal {
58 id: self.id,
59 ty: PhantomData,
60 ts: PhantomData,
61 }
62 }
63
64 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}