Skip to main content

orbital_base_components/signals/
model.rs

1use leptos::prelude::*;
2
3/// Cloneable handle to a reactive value for two-way props.
4#[derive(Clone)]
5pub struct SignalModel<T>(RwSignal<T>);
6
7impl<T> SignalModel<T>
8where
9    T: Send + Sync + 'static,
10{
11    pub fn new(value: T) -> Self {
12        Self(RwSignal::new(value))
13    }
14
15    pub fn from_rw(signal: RwSignal<T>) -> Self {
16        Self(signal)
17    }
18
19    pub fn get(&self) -> T
20    where
21        T: Clone,
22    {
23        self.0.get()
24    }
25
26    pub fn get_untracked(&self) -> T
27    where
28        T: Clone,
29    {
30        self.0.get_untracked()
31    }
32
33    pub fn set(&self, value: T) {
34        self.0.set(value);
35    }
36
37    pub fn update(&self, f: impl FnOnce(&mut T)) {
38        self.0.update(f);
39    }
40
41    pub fn with<U>(&self, f: impl FnOnce(&T) -> U) -> U {
42        self.0.with(f)
43    }
44
45    pub fn with_untracked<U>(&self, f: impl FnOnce(&T) -> U) -> U {
46        self.0.with_untracked(f)
47    }
48
49    pub fn read_only(&self) -> ReadSignal<T> {
50        self.0.read_only()
51    }
52
53    pub fn write_only(&self) -> WriteSignal<T> {
54        self.0.write_only()
55    }
56
57    pub fn split(&self) -> (ReadSignal<T>, WriteSignal<T>) {
58        self.0.split()
59    }
60}
61
62impl<T> From<RwSignal<T>> for SignalModel<T>
63where
64    T: Send + Sync + 'static,
65{
66    fn from(signal: RwSignal<T>) -> Self {
67        Self(signal)
68    }
69}
70
71impl<T> From<SignalModel<T>> for RwSignal<T>
72where
73    T: Send + Sync + 'static,
74{
75    fn from(model: SignalModel<T>) -> Self {
76        model.0
77    }
78}