Crates.io | async-oncecell |
lib.rs | async-oncecell |
version | 0.2.0 |
source | src |
created_at | 2021-04-08 17:43:51.06439 |
updated_at | 2021-04-16 15:11:59.966417 |
description | Asynchronous versions of OnceCell and Lazy |
homepage | |
repository | https://github.com/Yoeori/async-oncecell |
max_upload_size | |
id | 380980 |
size | 12,321 |
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
.
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.
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.
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 */);
}
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.
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.
In the future I hope to add asynchronous transform structs as well to be able to transform data lazily.