summaryrefslogtreecommitdiffstats
path: root/src/state_store.rs
diff options
context:
space:
mode:
authorLibravatar cel 🌸 <cel@bunny.garden>2025-06-02 19:50:45 +0100
committerLibravatar cel 🌸 <cel@bunny.garden>2025-06-02 19:50:45 +0100
commitab654372e4d3766c8df17623a6de8922fc2a1960 (patch)
tree59ff88ab5da68af23ad84bc2310730e29eb89410 /src/state_store.rs
parent6ee4190a26f32bfa953302ee363ad3bb6c384ebb (diff)
downloadmacaw-web-ab654372e4d3766c8df17623a6de8922fc2a1960.tar.gz
macaw-web-ab654372e4d3766c8df17623a6de8922fc2a1960.tar.bz2
macaw-web-ab654372e4d3766c8df17623a6de8922fc2a1960.zip
feat: make `MacawUser`, `MacawChat` and `MacawMessage` arena-allocated
Diffstat (limited to 'src/state_store.rs')
-rw-r--r--src/state_store.rs36
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