/ src / frontend / src / utils / stored_maybe_signal.rs
stored_maybe_signal.rs
 1  use leptos::{MaybeSignal, Signal, SignalGet, SignalGetUntracked, SignalWith, StoredValue};
 2  
 3  #[derive(Clone)]
 4  pub enum StoredMaybeSignal<T>
 5  where
 6      T: 'static,
 7  {
 8      StoredValue(StoredValue<T>),
 9      Signal(Signal<T>),
10  }
11  
12  impl<T: Clone> Copy for StoredMaybeSignal<T> {}
13  
14  impl<T: Clone> SignalGet for StoredMaybeSignal<T> {
15      type Value = T;
16  
17      fn get(&self) -> Self::Value {
18          match self {
19              StoredMaybeSignal::StoredValue(value) => value.get_value(),
20              StoredMaybeSignal::Signal(signal) => signal.get(),
21          }
22      }
23  
24      fn try_get(&self) -> Option<Self::Value> {
25          match self {
26              StoredMaybeSignal::StoredValue(value) => value.try_get_value(),
27              StoredMaybeSignal::Signal(signal) => signal.try_get(),
28          }
29      }
30  }
31  
32  impl<T: Clone> SignalGetUntracked for StoredMaybeSignal<T> {
33      type Value = T;
34  
35      fn get_untracked(&self) -> Self::Value {
36          match self {
37              StoredMaybeSignal::StoredValue(value) => value.get_value(),
38              StoredMaybeSignal::Signal(signal) => signal.get_untracked(),
39          }
40      }
41  
42      fn try_get_untracked(&self) -> Option<Self::Value> {
43          match self {
44              StoredMaybeSignal::StoredValue(value) => value.try_get_value(),
45              StoredMaybeSignal::Signal(signal) => signal.try_get_untracked(),
46          }
47      }
48  }
49  
50  impl<T> SignalWith for StoredMaybeSignal<T> {
51      type Value = T;
52  
53      fn with<O>(&self, f: impl FnOnce(&Self::Value) -> O) -> O {
54          match self {
55              StoredMaybeSignal::StoredValue(value) => value.with_value(f),
56              StoredMaybeSignal::Signal(signal) => signal.with(f),
57          }
58      }
59  
60      fn try_with<O>(&self, f: impl FnOnce(&Self::Value) -> O) -> Option<O> {
61          match self {
62              StoredMaybeSignal::StoredValue(value) => value.try_with_value(f),
63              StoredMaybeSignal::Signal(signal) => signal.try_with(f),
64          }
65      }
66  }
67  
68  impl<T> From<MaybeSignal<T>> for StoredMaybeSignal<T> {
69      fn from(value: MaybeSignal<T>) -> Self {
70          match value {
71              MaybeSignal::Static(value) => Self::StoredValue(StoredValue::new(value)),
72              MaybeSignal::Dynamic(signal) => Self::Signal(signal),
73          }
74      }
75  }