Resource

Struct Resource 

Source
pub struct Resource<T> { /* private fields */ }
Expand description

A reactive resource that automatically fetches data when its dependencies change.

Resource provides a way to reactively fetch data from async operations and automatically refetch when the input dependencies change. It manages loading states and ensures that only the most recent result is kept if multiple async operations complete rapidly.

§Concurrency Behavior

If multiple async operations complete while the main thread is busy processing other work, only the most recent result is kept.

§Examples

// Simple case: event loop executor, hash-based memoization, returns Option<T>
let resource = Resource::new(|| user_id.get(), |id| fetch_user(id));

// With initial value
let resource = Resource::with_initial(
    || user_id.get(),
    |id| fetch_user(id),
    User::default()
);

// Full customization
let resource = Resource::custom(|| user_id.get(), |id| fetch_user(id))
    .executor(my_executor)
    .key_fn(|id| *id)
    .initial(User::default())
    .build();

Implementations§

Source§

impl<T: 'static> Resource<T>

Source

pub fn new<Fut, Dep>( source: impl Fn() -> Dep + 'static, fetcher: impl Fn(Dep) -> Fut + 'static, ) -> Resource<Option<T>>
where Fut: Future<Output = T> + 'static, Dep: Hash + 'static,

Creates a new reactive resource with sensible defaults.

  • Executor: Main event loop (future does not need to be Send)
  • Memoization: Hash-based (only refetches when dependency hash changes)
  • Initial value: None (returns Resource<Option<U>>)
§Parameters
  • source - A function that returns the current dependency value(s).
  • fetcher - An async function that takes the dependency value and returns the fetched data.
§Examples
let user_resource = Resource::new(
    || user_id.get(),
    |id| async move { fetch_user(id).await }
);
Source

pub fn with_initial<Fut, Dep>( source: impl Fn() -> Dep + 'static, fetcher: impl Fn(Dep) -> Fut + 'static, initial: T, ) -> Self
where T: 'static, Fut: Future<Output = T> + 'static, Dep: Hash + 'static,

Creates a new reactive resource with an initial value.

Uses the same defaults as new() but allows you to specify an initial value so the resource is never None.

  • Executor: Main event loop (future does not need to be Send)
  • Memoization: Hash-based (only refetches when dependency hash changes)
§Parameters
  • source - A function that returns the current dependency value(s).
  • fetcher - An async function that takes the dependency value and returns the fetched data.
  • initial - The initial value for the resource before any fetch completes.
§Examples
let user_resource = Resource::with_initial(
    || user_id.get(),
    |id| async move { fetch_user(id).await },
    User::default()
);
Source

pub fn custom<Fut, Dep>( source: impl Fn() -> Dep + 'static, fetcher: impl Fn(Dep) -> Fut + 'static, ) -> ResourceBuilder<Fut, Dep, T, DefaultHashKeyFn, EventLoopExecutor, WithMemo, NoInitial>
where Fut: Future<Output = T> + 'static, Dep: Hash + 'static,

Creates a resource builder for full customization.

Use this when you need to customize:

  • The executor (tokio, custom, etc.)
  • The key function (custom comparison logic)
  • Memoization behavior (disable with .no_memo())
  • Initial value
§Examples
// Tokio executor with custom key function
let resource = Resource::custom(|| user_id.get(), |id| fetch_user(id))
    .tokio_spawn()
    .key_fn(|id| *id)
    .build();

// Disable memoization
let resource = Resource::custom(|| (), || fetch_latest())
    .no_memo()
    .build();
Source

pub fn refetch(&self)

Manually triggers a refetch of the resource, bypassing memoization.

This will start a new async fetch operation using the current dependency value, even if that value hasn’t changed since the last fetch.

§Behavior
  • Sets the finished state to false
  • Spawns a new fetch operation
  • Bypasses memoization for this fetch
Source

pub fn is_loading(&self) -> bool
where T: 'static,

Returns true if an async fetch operation is currently in progress.

This can be used to show loading indicators in the UI.

Trait Implementations§

Source§

impl<T> Clone for Resource<T>

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<T: Clone + 'static> SignalGet<T> for Resource<T>

Source§

fn id(&self) -> ReactiveId

get the Signal Id
Source§

fn get_untracked(&self) -> T
where T: 'static,

Source§

fn get(&self) -> T
where T: 'static,

Source§

fn try_get(&self) -> Option<T>
where T: 'static,

Source§

fn try_get_untracked(&self) -> Option<T>
where T: 'static,

Source§

impl<T> SignalRead<T> for Resource<T>

Source§

fn id(&self) -> ReactiveId

get the Signal Id
Source§

fn try_read(&self) -> Option<ReadRef<'_, T>>
where T: 'static,

If the signal isn’t disposed, reads the data stored in the Signal and subscribes to the current running effect.
Source§

fn try_read_untracked(&self) -> Option<ReadRef<'_, T>>
where T: 'static,

If the signal isn’t disposed, reads the data stored in the Signal without subscribing.
Source§

fn read(&self) -> ReadRef<'_, T>
where T: 'static,

Reads the data stored in the Signal, subscribing the current running effect.
Source§

fn read_untracked(&self) -> ReadRef<'_, T>
where T: 'static,

Reads the data stored in the Signal without subscribing.
Source§

impl<T: 'static> SignalTrack<T> for Resource<T>

Source§

fn id(&self) -> ReactiveId

Source§

fn track(&self)

Only subscribes to the current running effect to this Signal.
Source§

fn try_track(&self)

If the signal isn’t disposed,
Source§

impl<T> SignalWith<T> for Resource<T>

Source§

fn id(&self) -> ReactiveId

get the Signal Id
Source§

fn with<O>(&self, f: impl FnOnce(&T) -> O) -> O
where T: 'static,

Source§

fn with_untracked<O>(&self, f: impl FnOnce(&T) -> O) -> O
where T: 'static,

Source§

fn try_with<O>(&self, f: impl FnOnce(Option<&T>) -> O) -> O
where T: 'static,

Source§

fn try_with_untracked<O>(&self, f: impl FnOnce(Option<&T>) -> O) -> O
where T: 'static,

Source§

impl<T> Copy for Resource<T>

Auto Trait Implementations§

§

impl<T> Freeze for Resource<T>

§

impl<T> RefUnwindSafe for Resource<T>
where T: RefUnwindSafe,

§

impl<T> !Send for Resource<T>

§

impl<T> !Sync for Resource<T>

§

impl<T> Unpin for Resource<T>
where T: Unpin,

§

impl<T> UnwindSafe for Resource<T>
where T: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> AutoreleaseSafe for T
where T: ?Sized,

Source§

impl<T> AutoreleaseSafe for T
where T: ?Sized,