Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/whatisaphone/genawaiter
Stackless generators on stable Rust.
https://github.com/whatisaphone/genawaiter
async await coroutine generator rust yield
Last synced: 4 days ago
JSON representation
Stackless generators on stable Rust.
- Host: GitHub
- URL: https://github.com/whatisaphone/genawaiter
- Owner: whatisaphone
- Created: 2019-11-03T18:18:48.000Z (about 5 years ago)
- Default Branch: master
- Last Pushed: 2022-06-24T07:15:14.000Z (over 2 years ago)
- Last Synced: 2024-05-01T15:17:05.206Z (8 months ago)
- Topics: async, await, coroutine, generator, rust, yield
- Language: Rust
- Homepage: https://docs.rs/genawaiter
- Size: 219 KB
- Stars: 429
- Watchers: 12
- Forks: 28
- Open Issues: 18
-
Metadata Files:
- Readme: README-crates-io.md
- Changelog: CHANGELOG.md
Awesome Lists containing this project
README
# genawaiter
[![crate-badge]][crate-link] [![docs-badge]][docs-link] [![ci-badge]][ci-link]
[crate-badge]: https://img.shields.io/crates/v/genawaiter.svg
[crate-link]: https://crates.io/crates/genawaiter
[docs-badge]: https://docs.rs/genawaiter/badge.svg
[docs-link]: https://docs.rs/genawaiter
[ci-badge]: https://github.com/whatisaphone/genawaiter/workflows/CI/badge.svg
[ci-link]: https://github.com/whatisaphone/genawaiter/actionsThis crate implements stackless generators (aka coroutines) in stable Rust. Instead of using `yield`, which [won't be stabilized anytime soon][yield-unstable], you use `async`/`await`, which is stable today.
[yield-unstable]: https://doc.rust-lang.org/nightly/unstable-book/language-features/generators.html
Features:
- supports resume arguments and completion values
- supports async generators (e.g., `Stream`s)
- allocation-free
- no runtime dependencies
- no compile-time dependencies either, with `default-features = false`
- built on top of standard language constructs, which means there are no platform-specific shenanigansExample:
```rust
let odd_numbers_less_than_ten = gen!({
let mut n = 1;
while n < 10 {
yield_!(n); // Suspend a function at any point with a value.
n += 2;
}
});// Generators can be used as ordinary iterators.
for num in odd_numbers_less_than_ten {
println!("{}", num);
}
```Result:
```text
1
3
5
7
9
```And here is the same generator, this time without macros. This is how you do things with `default-features = false` (which eliminates the proc macro dependencies).
```rust
let odd_numbers_less_than_ten = Gen::new(|co| async move {
let mut n = 1;
while n < 10 {
co.yield_(n).await;
n += 2;
}
});
```[See the docs for more.](https://docs.rs/genawaiter)