async-oncecell

Asynchronous versions of OnceCell and Lazy

2 unstable releases

0.2.0 Apr 16, 2021
0.1.0 Apr 8, 2021
Download history 69/week @ 2024-07-20 74/week @ 2024-07-27 54/week @ 2024-08-03 59/week @ 2024-08-10 449/week @ 2024-08-17 649/week @ 2024-08-24 616/week @ 2024-08-31 1564/week @ 2024-09-07 106/week @ 2024-09-14 2029/week @ 2024-09-21 2587/week @ 2024-09-28 3886/week @ 2024-10-05 507/week @ 2024-10-12 116/week @ 2024-10-19 280/week @ 2024-10-26 1768/week @ 2024-11-02

3,416 downloads per month
Used in jcargo

MIT/Apache

13KB
164 lines

async-oncecell

Crates.io MIT or Apache 2.0 licensed Continuous integration

This crate offers an asynchronous version of Rust's OnceCell and Lazy structs, which allows its users to use async/await inside of the OnceCell and Lazy constructors.

The crate should work with any stable asynchronous runtime like tokio and async-std and only depends on the futures crate for an async aware Mutex.

Usage

The OnceCell can be used the similarly to the other popular OnceCell crates, and the implementation in the standard library with the exception that a Future is given instead of a closjure and that some functions return a Future.

Example

use async_oncecell::OnceCell;

#[tokio::main]
async fn main() {
    let cell = OnceCell::new();
    let v = cell.get_or_init(async { 
        // Expensive operation
     }).await;
    assert_eq!(cell.get(), Some(v));
}

The same holds for Lazy, however since the get() method needs to be awaited, no automatic dereferencing is implemented.

Example

use async_oncecell::Lazy;

#[tokio::main]
async fn main() {
    let lazy_value = Lazy::new(async {
        // Expensive operation
    });
    assert_eq!(lazy_value.get().await, /* result of expensive operation */);
}

Stability

This crate is extremely new and has therefore not extensively been tested. Next to that, the author is also inexperienced in working with unsafe Rust. While care has been taken in making this crate safe, it is not recommended for production use. As mentioned in the Contributing section: feedback and pull requests are very much appreciated, even more so if you see any problems with the soundness of the crate.

Contributing

Contributions are always welcome! Please create an issue or pull request if you have any insight which might help to improve this crate. This is my first real Rust crate, so I'm eager to learn from the community.

Wishlist

In the future I hope to add asynchronous transform structs as well to be able to transform data lazily.

Dependencies

~1MB
~15K SLoC