short_future

Crates.ioshort_future
lib.rsshort_future
version0.1.1
sourcesrc
created_at2024-08-16 22:47:22.720207
updated_at2024-08-16 22:51:23.637002
descriptionFuture with shorter lifetime for async closures
homepage
repositoryhttps://github.com/ldanilek/short_future
max_upload_size
id1341087
size10,680
Lee Danilek (ldanilek)

documentation

README

Futures with short lifetimes

short_future is a library defining a utility for working with Future lifetimes: ShortBoxFuture<'a, 'b, T> can capture borrows with lifetimes of 'a and 'b at the same time.

ShortBoxFuture works around limitations of HRTBs and explicit lifetime bounds. This is useful when wrapping async closures, where the closure returns a future that depends on both:

  1. references in the enclosing scope with lifetime 'a.
  2. references in the closure's arguments with lifetime 'b.

For example, you can write a helper that retries a database operation, where a new transaction is created for every retry, and the data is borrowed from the enclosing scope:

async fn run_twice<'a>(&'a self, f: F) -> anyhow::Result<()>
where F: for<'b> Fn(&'b mut Transaction) -> ShortBoxFuture<'b, 'a, anyhow::Result<()>>
{
    for i in 0..2 {
        let mut tx = self.begin();
        f(&mut tx).0.await?;
    }
    Ok(())
}

async fn go(&self) {
    let data = get_data();
    self.run_twice(|tx| async {
        tx.get(&data.id).await;
    }.into()).await
}

See the tests for more examples, and for demonstrations of the issues that necessitate ShortBoxFuture.

Commit count: 0

cargo fmt