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<ArcMappedSignal<T>> for Signal<T>
impl<T> From<ArcMappedSignal<T>> for Signal<T>
Source§fn from(value: ArcMappedSignal<T>) -> Self
fn from(value: ArcMappedSignal<T>) -> Self
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<MappedSignal<T>> for Signal<T>
impl<T> From<MappedSignal<T>> for Signal<T>
Source§fn from(value: MappedSignal<T>) -> Self
fn from(value: MappedSignal<T>) -> 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.