async-oncecell 0.2.0

Asynchronous versions of OnceCell and Lazy
Documentation
# 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.