# 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: ```rust 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`.