# async-oncecell [![Crates.io][crates-badge]][crates-url] ![MIT or Apache 2.0 licensed][license-badge] [![Continuous integration][actions-badge]][actions-url] [crates-badge]: https://img.shields.io/crates/v/async-oncecell [crates-url]: https://crates.io/crates/async-oncecell [license-badge]: https://img.shields.io/crates/l/async-oncecell [actions-badge]: https://github.com/Yoeori/async-oncecell/actions/workflows/main.yml/badge.svg [actions-url]: https://github.com/Yoeori/async-oncecell/actions/workflows/main.yml 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`](https://github.com/tokio-rs/tokio) and [`async-std`](https://github.com/async-rs/async-std) and only depends on the `futures` crate for an async aware [`Mutex`](https://docs.rs/futures/0.3.13/futures/lock/struct.Mutex.html). ## 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 ```rust 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 ```rust 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.