diff options
Diffstat (limited to 'src/state_store.rs')
-rw-r--r-- | src/state_store.rs | 36 |
1 files changed, 22 insertions, 14 deletions
diff --git a/src/state_store.rs b/src/state_store.rs index 2536cda..8d80b3f 100644 --- a/src/state_store.rs +++ b/src/state_store.rs @@ -6,7 +6,7 @@ use leptos::prelude::*; // V has to be an arc signal #[derive(Debug)] pub struct ArcStateStore<K, V> { - store: Arc<RwLock<HashMap<K, (V, usize)>>>, + store: Arc<RwLock<HashMap<K, (ArcRwSignal<V>, usize)>>>, } impl<K, V> PartialEq for ArcStateStore<K, V> { @@ -115,18 +115,26 @@ where let store = self.inner.try_get_value().unwrap(); let mut store = store.store.write().unwrap(); if let Some((v, count)) = store.get_mut(&key) { - *v = value.clone(); + v.set(value); *count += 1; + StateListener { + value: v.clone(), + cleaner: StateCleaner { + key, + state_store: self.clone(), + }, + } } else { - store.insert(key.clone(), (value.clone(), 1)); + let v = ArcRwSignal::new(value); + store.insert(key.clone(), (v.clone(), 1)); + StateListener { + value: v.into(), + cleaner: StateCleaner { + key, + state_store: self.clone(), + }, + } } - }; - StateListener { - value, - cleaner: StateCleaner { - key, - state_store: self.clone(), - }, } } } @@ -140,7 +148,7 @@ where let store = self.inner.try_get_value().unwrap(); let mut store = store.store.write().unwrap(); if let Some((v, _)) = store.get_mut(key) { - *v = value; + v.set(value) } } @@ -148,7 +156,7 @@ where let store = self.inner.try_get_value().unwrap(); let mut store = store.store.write().unwrap(); if let Some((v, _)) = store.get_mut(key) { - modify(v); + v.update(|v| modify(v)); } } @@ -171,7 +179,7 @@ where K: Eq + std::hash::Hash + 'static + std::marker::Send + std::marker::Sync, V: 'static + std::marker::Send + std::marker::Sync, { - value: V, + value: ArcRwSignal<V>, cleaner: StateCleaner<K, V>, } @@ -180,7 +188,7 @@ impl< V: std::marker::Send + std::marker::Sync, > Deref for StateListener<K, V> { - type Target = V; + type Target = ArcRwSignal<V>; fn deref(&self) -> &Self::Target { &self.value |