From ab654372e4d3766c8df17623a6de8922fc2a1960 Mon Sep 17 00:00:00 2001 From: cel 🌸 Date: Mon, 2 Jun 2025 19:50:45 +0100 Subject: feat: make `MacawUser`, `MacawChat` and `MacawMessage` arena-allocated --- src/state_store.rs | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) (limited to 'src/state_store.rs') 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 { - store: Arc>>, + store: Arc, usize)>>>, } impl PartialEq for ArcStateStore { @@ -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, cleaner: StateCleaner, } @@ -180,7 +188,7 @@ impl< V: std::marker::Send + std::marker::Sync, > Deref for StateListener { - type Target = V; + type Target = ArcRwSignal; fn deref(&self) -> &Self::Target { &self.value -- cgit