7 releases
0.99.1 | Mar 9, 2020 |
---|---|
0.99.0 | Feb 16, 2020 |
0.2.2 | Nov 26, 2019 |
0.1.1 | Nov 3, 2019 |
#76 in Asynchronous
62,398 downloads per month
Used in 105 crates
(46 directly)
100KB
1.5K
SLoC
genawaiter
This crate implements stackless generators (aka coroutines) in stable Rust. Instead of using yield
, which won't be stabilized anytime soon, you use async
/await
, which is stable today.
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
- no compile-time dependencies either, with
- built on top of standard language constructs, which means there are no platform-specific shenanigans
Example:
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:
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).
let odd_numbers_less_than_ten = Gen::new(|co| async move {
let mut n = 1;
while n < 10 {
co.yield_(n).await;
n += 2;
}
});
Dependencies
~250KB