diff --git a/packages/signals/src/signal.rs b/packages/signals/src/signal.rs index a1fba89aa..97e22749b 100644 --- a/packages/signals/src/signal.rs +++ b/packages/signals/src/signal.rs @@ -116,23 +116,22 @@ pub fn use_signal_sync(f: impl FnOnce() -> T) -> Signa }) } -#[derive(Clone)] struct Unsubscriber { scope: ScopeId, subscribers: UnsubscriberArray, } -type UnsubscriberArray = Rc>>>>>; +type UnsubscriberArray = Vec>>>; impl Drop for Unsubscriber { fn drop(&mut self) { - for subscribers in self.subscribers.borrow().iter() { + for subscribers in &self.subscribers { subscribers.borrow_mut().retain(|s| *s != self.scope); } } } -fn current_unsubscriber() -> Unsubscriber { +fn current_unsubscriber() -> Rc> { match has_context() { Some(rt) => rt, None => { @@ -140,7 +139,7 @@ fn current_unsubscriber() -> Unsubscriber { scope: current_scope_id().expect("in a virtual dom"), subscribers: Default::default(), }; - provide_context(owner) + provide_context(Rc::new(RefCell::new(owner))) } } } @@ -308,7 +307,7 @@ impl>> Signal { let mut subscribers = inner.subscribers.write(); subscribers.subscribers.push(current_scope_id); let unsubscriber = current_unsubscriber(); - subscribers.subscribers.push(unsubscriber.scope); + subscribers.subscribers.push(unsubscriber.borrow().scope); } } }