Struct eyeball::Observable
source · pub struct Observable<T, L: Lock = SyncLock> { /* private fields */ }
Expand description
A value whose changes will be broadcast to subscribers.
Observable<T>
dereferences to T
, and does not have methods of its own to
not clash with methods of the inner type. Instead, to interact with the
Observable
itself rather than the inner value, use its associated
functions (e.g. Observable::subscribe(observable)
).
§Async-aware locking
Contrary to SharedObservable
’s async-aware locking support, using
Observable
with L
= [AsyncLock
] with this type is rarely useful since
having access to the Observable
means nobody can be mutating the inner
value in parallel. It allows a subscriber to read-lock the value over a
.await
point without losing Send
-ness of the future though.
Implementations§
source§impl<T> Observable<T>
impl<T> Observable<T>
sourcepub fn subscribe(this: &Self) -> Subscriber<T>
pub fn subscribe(this: &Self) -> Subscriber<T>
Obtain a new subscriber.
Calling .next().await
or .next_ref().await
on the returned
subscriber only resolves once the inner value has been updated again
after the call to subscribe
.
See subscribe_reset
if you want to obtain a
subscriber that immediately yields without any updates.
sourcepub fn subscribe_reset(this: &Self) -> Subscriber<T>
pub fn subscribe_reset(this: &Self) -> Subscriber<T>
Obtain a new subscriber that immediately yields.
.subscribe_reset()
is equivalent to .subscribe()
with a subsequent
call to .reset()
on the returned subscriber.
In contrast to subscribe
, calling .next().await
or .next_ref().await
on the returned subscriber before updating the
inner value yields the current value instead of waiting. Further calls
to either of the two will wait for updates.
sourcepub fn get(this: &Self) -> &T
pub fn get(this: &Self) -> &T
Get a reference to the inner value.
Usually, you don’t need to call this function since Observable<T>
implements Deref
. Use this if you want to pass the inner value to a
generic function where the compiler can’t infer that you want to have
the Observable
dereferenced otherwise.
sourcepub fn set(this: &mut Self, value: T) -> T
pub fn set(this: &mut Self, value: T) -> T
Set the inner value to the given value
, notify subscribers and return
the previous value.
sourcepub fn set_if_not_eq(this: &mut Self, value: T) -> Option<T>where
T: PartialEq,
pub fn set_if_not_eq(this: &mut Self, value: T) -> Option<T>where
T: PartialEq,
Set the inner value to the given value
if it doesn’t compare equal to
the existing value.
If the inner value is set, subscribers are notified and
Some(previous_value)
is returned. Otherwise, None
is returned.
sourcepub fn set_if_hash_not_eq(this: &mut Self, value: T) -> Option<T>where
T: Hash,
pub fn set_if_hash_not_eq(this: &mut Self, value: T) -> Option<T>where
T: Hash,
Set the inner value to the given value
if it has a different hash than
the existing value.
If the inner value is set, subscribers are notified and
Some(previous_value)
is returned. Otherwise, None
is returned.
sourcepub fn take(this: &mut Self) -> Twhere
T: Default,
pub fn take(this: &mut Self) -> Twhere
T: Default,
Set the inner value to a Default
instance of its type, notify
subscribers and return the previous value.
Shorthand for Observable::set(this, T::default())
.
source§impl<T, L: Lock> Observable<T, L>
impl<T, L: Lock> Observable<T, L>
sourcepub fn subscriber_count(this: &Self) -> usize
pub fn subscriber_count(this: &Self) -> usize
Get the number of subscribers.
Be careful when using this. The result is only reliable if it is exactly
0
, as otherwise it could be incremented right after your call to this
function, before you look at its result or do anything based on that.
Convert this unique Observable
into a SharedObservable
.
Any subscribers created for self
remain valid.