diff --git a/dynatos-reactive/src/signal.rs b/dynatos-reactive/src/signal.rs index af4b42f..6652753 100644 --- a/dynatos-reactive/src/signal.rs +++ b/dynatos-reactive/src/signal.rs @@ -130,9 +130,15 @@ impl SignalBorrow for Signal { impl SignalReplace for Signal { type Value = T; + #[track_caller] fn replace(&self, new_value: T) -> Self::Value { mem::replace(&mut self.borrow_mut(), new_value) } + + #[track_caller] + fn replace_raw(&self, new_value: T) -> Self::Value { + mem::replace(&mut self.borrow_mut_raw(), new_value) + } } /// Triggers on `Drop` diff --git a/dynatos-reactive/src/signal/ops/replace.rs b/dynatos-reactive/src/signal/ops/replace.rs index 5bbc1c0..8b86581 100644 --- a/dynatos-reactive/src/signal/ops/replace.rs +++ b/dynatos-reactive/src/signal/ops/replace.rs @@ -6,4 +6,7 @@ pub trait SignalReplace { /// Replaces the signal value, returning the previous value fn replace(&self, new_value: T) -> Self::Value; + + /// Replaces the signal value, returning the previous value without triggering any dependencies. + fn replace_raw(&self, new_value: T) -> Self::Value; } diff --git a/dynatos-reactive/src/with_default.rs b/dynatos-reactive/src/with_default.rs index 0098e96..fb21bbd 100644 --- a/dynatos-reactive/src/with_default.rs +++ b/dynatos-reactive/src/with_default.rs @@ -167,6 +167,11 @@ where fn replace(&self, new_value: T) -> Self::Value { self.inner.replace(Some(new_value)).unwrap_or(self.default) } + + #[track_caller] + fn replace_raw(&self, new_value: T) -> Self::Value { + self.inner.replace_raw(Some(new_value)).unwrap_or(self.default) + } } impl SignalReplace> for WithDefault @@ -180,6 +185,11 @@ where fn replace(&self, new_value: Option) -> Self::Value { self.inner.replace(new_value).unwrap_or(self.default) } + + #[track_caller] + fn replace_raw(&self, new_value: Option) -> Self::Value { + self.inner.replace_raw(new_value).unwrap_or(self.default) + } } /// Reference type for [`SignalBorrowMut`] impl diff --git a/dynatos-router/src/query_array_signal.rs b/dynatos-router/src/query_array_signal.rs index aef589d..95ef4af 100644 --- a/dynatos-router/src/query_array_signal.rs +++ b/dynatos-router/src/query_array_signal.rs @@ -119,6 +119,11 @@ where fn replace(&self, new_value: Vec) -> Self::Value { mem::replace(&mut self.borrow_mut(), new_value) } + + #[track_caller] + fn replace_raw(&self, new_value: Vec) -> Self::Value { + mem::replace(&mut self.borrow_mut_raw(), new_value) + } } /// Updates the location on `Drop` diff --git a/dynatos-router/src/query_signal.rs b/dynatos-router/src/query_signal.rs index 1775e7c..6cc2c5b 100644 --- a/dynatos-router/src/query_signal.rs +++ b/dynatos-router/src/query_signal.rs @@ -116,6 +116,11 @@ where fn replace(&self, new_value: Option) -> Self::Value { mem::replace(&mut self.borrow_mut(), new_value) } + + #[track_caller] + fn replace_raw(&self, new_value: Option) -> Self::Value { + mem::replace(&mut self.borrow_mut_raw(), new_value) + } } /// Updates the location on `Drop`