pub struct Signal<T, S = SyncStorage>where
S: Storage<T>,{ /* private fields */ }Expand description
A wrapper for any kind of arena-allocated reactive signal:
a ReadSignal, Memo, RwSignal, or derived signal closure,
or a plain value of the same type
This allows you to create APIs that take T or any reactive value that returns T
as an argument, rather than adding a generic F: Fn() -> T.
Values can be accessed with the same function call, read(), with(), and get()
APIs as other signals.
§Important Notes about Derived Signals
Signal::derive() is simply a way to box and type-erase a “derived signal,” which
is a plain closure that accesses one or more signals. It does not cache the value
of that computation. Accessing the value of a Signal<_> that is created using Signal::derive()
will run the closure again every time you call .read(), .with(), or .get().
If you want the closure to run the minimal number of times necessary to update its state,
and then to cache its value, you should use a Memo (and convert it into a Signal<_>)
rather than using Signal::derive().
Note that for many computations, it is nevertheless less expensive to use a derived signal than to create a separate memo and to cache the value: creating a new reactive node and taking the lock on that cached value whenever you access the signal is more expensive than simply re-running the calculation in many cases.
Implementations§
Source§impl<T> Signal<T>
impl<T> Signal<T>
Sourcepub fn derive(derived_signal: impl Fn() -> T + Send + Sync + 'static) -> Self
pub fn derive(derived_signal: impl Fn() -> T + Send + Sync + 'static) -> Self
Wraps a derived signal, i.e., any computation that accesses one or more reactive signals.
let (count, set_count) = signal(2);
let double_count = Signal::derive(move || count.get() * 2);
// this function takes any kind of wrapped signal
fn above_3(arg: &Signal<i32>) -> bool {
arg.get() > 3
}
assert_eq!(above_3(&count.into()), false);
assert_eq!(above_3(&double_count), true);Sourcepub fn stored(value: T) -> Self
pub fn stored(value: T) -> Self
Moves a static, nonreactive value into a signal, backed by ArcStoredValue.
Source§impl<T> Signal<T, LocalStorage>where
T: 'static,
impl<T> Signal<T, LocalStorage>where
T: 'static,
Sourcepub fn derive_local(derived_signal: impl Fn() -> T + 'static) -> Self
pub fn derive_local(derived_signal: impl Fn() -> T + 'static) -> Self
Wraps a derived signal. Works like Signal::derive but uses LocalStorage.
Sourcepub fn stored_local(value: T) -> Self
pub fn stored_local(value: T) -> Self
Moves a static, nonreactive value into a signal, backed by ArcStoredValue.
Works like Signal::stored but uses LocalStorage.
Trait Implementations§
Source§impl<T, S> DefinedAt for Signal<T, S>where
S: Storage<T>,
impl<T, S> DefinedAt for Signal<T, S>where
S: Storage<T>,
Source§fn defined_at(&self) -> Option<&'static Location<'static>>
fn defined_at(&self) -> Option<&'static Location<'static>>
None in
release mode.Source§impl<T> From<ArcMemo<T, LocalStorage>> for Signal<T, LocalStorage>
impl<T> From<ArcMemo<T, LocalStorage>> for Signal<T, LocalStorage>
Source§fn from(value: ArcMemo<T, LocalStorage>) -> Self
fn from(value: ArcMemo<T, LocalStorage>) -> Self
Source§impl<T> From<ArcReadSignal<T>> for Signal<T>
impl<T> From<ArcReadSignal<T>> for Signal<T>
Source§fn from(value: ArcReadSignal<T>) -> Self
fn from(value: ArcReadSignal<T>) -> Self
Source§impl<T> From<ArcReadSignal<T>> for Signal<T, LocalStorage>
impl<T> From<ArcReadSignal<T>> for Signal<T, LocalStorage>
Source§fn from(value: ArcReadSignal<T>) -> Self
fn from(value: ArcReadSignal<T>) -> Self
Source§impl<T> From<ArcRwSignal<T>> for Signal<T>
impl<T> From<ArcRwSignal<T>> for Signal<T>
Source§fn from(value: ArcRwSignal<T>) -> Self
fn from(value: ArcRwSignal<T>) -> Self
Source§impl<T> From<ArcRwSignal<T>> for Signal<T, LocalStorage>
impl<T> From<ArcRwSignal<T>> for Signal<T, LocalStorage>
Source§fn from(value: ArcRwSignal<T>) -> Self
fn from(value: ArcRwSignal<T>) -> Self
Source§impl<T> From<ArcSignal<T>> for Signal<T>
impl<T> From<ArcSignal<T>> for Signal<T>
Source§fn from(value: ArcSignal<T, SyncStorage>) -> Self
fn from(value: ArcSignal<T, SyncStorage>) -> Self
Source§impl<T> From<MaybeSignal<T>> for Signal<Option<T>>
impl<T> From<MaybeSignal<T>> for Signal<Option<T>>
Source§fn from(value: MaybeSignal<T>) -> Self
fn from(value: MaybeSignal<T>) -> Self
Source§impl<T> From<MaybeSignal<T>> for Signal<T>
impl<T> From<MaybeSignal<T>> for Signal<T>
Source§fn from(value: MaybeSignal<T>) -> Self
fn from(value: MaybeSignal<T>) -> Self
Source§impl<T> From<MaybeSignal<T, LocalStorage>> for Signal<Option<T>, LocalStorage>
impl<T> From<MaybeSignal<T, LocalStorage>> for Signal<Option<T>, LocalStorage>
Source§fn from(value: MaybeSignal<T, LocalStorage>) -> Self
fn from(value: MaybeSignal<T, LocalStorage>) -> Self
Source§impl<T> From<MaybeSignal<T, LocalStorage>> for Signal<T, LocalStorage>
impl<T> From<MaybeSignal<T, LocalStorage>> for Signal<T, LocalStorage>
Source§fn from(value: MaybeSignal<T, LocalStorage>) -> Self
fn from(value: MaybeSignal<T, LocalStorage>) -> Self
Source§impl<T> From<Memo<T, LocalStorage>> for Signal<T, LocalStorage>where
T: 'static,
impl<T> From<Memo<T, LocalStorage>> for Signal<T, LocalStorage>where
T: 'static,
Source§fn from(value: Memo<T, LocalStorage>) -> Self
fn from(value: Memo<T, LocalStorage>) -> Self
Source§impl<T> From<ReadSignal<T>> for Signal<T>
impl<T> From<ReadSignal<T>> for Signal<T>
Source§fn from(value: ReadSignal<T>) -> Self
fn from(value: ReadSignal<T>) -> Self
Source§impl<T> From<ReadSignal<T, LocalStorage>> for Signal<T, LocalStorage>where
T: 'static,
impl<T> From<ReadSignal<T, LocalStorage>> for Signal<T, LocalStorage>where
T: 'static,
Source§fn from(value: ReadSignal<T, LocalStorage>) -> Self
fn from(value: ReadSignal<T, LocalStorage>) -> Self
Source§impl<T> From<RwSignal<T, LocalStorage>> for Signal<T, LocalStorage>where
T: 'static,
impl<T> From<RwSignal<T, LocalStorage>> for Signal<T, LocalStorage>where
T: 'static,
Source§fn from(value: RwSignal<T, LocalStorage>) -> Self
fn from(value: RwSignal<T, LocalStorage>) -> Self
Source§impl<T> From<Signal<Option<T>, LocalStorage>> for MaybeProp<T, LocalStorage>
impl<T> From<Signal<Option<T>, LocalStorage>> for MaybeProp<T, LocalStorage>
Source§impl<T> From<Signal<T, LocalStorage>> for MaybeProp<T, LocalStorage>
impl<T> From<Signal<T, LocalStorage>> for MaybeProp<T, LocalStorage>
Source§fn from(value: Signal<T, LocalStorage>) -> Self
fn from(value: Signal<T, LocalStorage>) -> Self
Source§impl<T> From<Signal<T, LocalStorage>> for Signal<Option<T>, LocalStorage>where
T: Clone + 'static,
impl<T> From<Signal<T, LocalStorage>> for Signal<Option<T>, LocalStorage>where
T: Clone + 'static,
Source§fn from(value: Signal<T, LocalStorage>) -> Self
fn from(value: Signal<T, LocalStorage>) -> Self
Source§impl<T> From<T> for Signal<T, LocalStorage>where
T: 'static,
impl<T> From<T> for Signal<T, LocalStorage>where
T: 'static,
Source§impl<T> FromLocal<ArcSignal<T, LocalStorage>> for Signal<T, LocalStorage>where
T: 'static,
impl<T> FromLocal<ArcSignal<T, LocalStorage>> for Signal<T, LocalStorage>where
T: 'static,
Source§fn from_local(value: ArcSignal<T, LocalStorage>) -> Self
fn from_local(value: ArcSignal<T, LocalStorage>) -> Self
Source§impl<T, S> ReadUntracked for Signal<T, S>
impl<T, S> ReadUntracked for Signal<T, S>
Source§fn custom_try_read(&self) -> Option<Option<Self::Value>>
fn custom_try_read(&self) -> Option<Option<Self::Value>>
Overriding the default auto implemented Read::try_read to combine read and track,
to avoid 2 clones and just have 1 in the SignalTypes::DerivedSignal.
Source§type Value = ReadGuard<T, SignalReadGuard<T, S>>
type Value = ReadGuard<T, SignalReadGuard<T, S>>
Source§fn try_read_untracked(&self) -> Option<Self::Value>
fn try_read_untracked(&self) -> Option<Self::Value>
None if the signal has already been disposed.Source§fn read_untracked(&self) -> Self::Value
fn read_untracked(&self) -> Self::Value
impl<T, S> Copy for Signal<T, S>where
S: Storage<T>,
impl<T, S> Eq for Signal<T, S>where
S: Storage<T>,
Auto Trait Implementations§
impl<T, S> Freeze for Signal<T, S>
impl<T, S> RefUnwindSafe for Signal<T, S>
impl<T, S> Send for Signal<T, S>
impl<T, S> Sync for Signal<T, S>
impl<T, S> Unpin for Signal<T, S>
impl<T, S> UnwindSafe for Signal<T, S>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<S, T> FromStream<T> for S
impl<S, T> FromStream<T> for S
Source§fn from_stream(stream: impl Stream<Item = T> + Send + 'static) -> S
fn from_stream(stream: impl Stream<Item = T> + Send + 'static) -> S
Source§fn from_stream_unsync(stream: impl Stream<Item = T> + 'static) -> S
fn from_stream_unsync(stream: impl Stream<Item = T> + 'static) -> S
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> Read for Twhere
T: Track + ReadUntracked,
impl<T> Read for Twhere
T: Track + ReadUntracked,
Source§impl<T> StorageAccess<T> for T
impl<T> StorageAccess<T> for T
Source§fn as_borrowed(&self) -> &T
fn as_borrowed(&self) -> &T
Source§fn into_taken(self) -> T
fn into_taken(self) -> T
Source§impl<T> With for Twhere
T: Read,
impl<T> With for Twhere
T: Read,
Source§type Value = <<T as Read>::Value as Deref>::Target
type Value = <<T as Read>::Value as Deref>::Target
Source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
Source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
Source§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
Source§impl<T> WithUntracked for Twhere
T: DefinedAt + ReadUntracked,
impl<T> WithUntracked for Twhere
T: DefinedAt + ReadUntracked,
Source§type Value = <<T as ReadUntracked>::Value as Deref>::Target
type Value = <<T as ReadUntracked>::Value as Deref>::Target
Source§fn try_with_untracked<U>(
&self,
fun: impl FnOnce(&<T as WithUntracked>::Value) -> U,
) -> Option<U>
fn try_with_untracked<U>( &self, fun: impl FnOnce(&<T as WithUntracked>::Value) -> U, ) -> Option<U>
None if the signal has already been disposed.