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

#580 in Asynchronous

Download history 14061/week @ 2025-07-08 14128/week @ 2025-07-15 13017/week @ 2025-07-22 12394/week @ 2025-07-29 28840/week @ 2025-08-05 31643/week @ 2025-08-12 27986/week @ 2025-08-19 22631/week @ 2025-08-26 25995/week @ 2025-09-02 27971/week @ 2025-09-09 28363/week @ 2025-09-16 31663/week @ 2025-09-23 30142/week @ 2025-09-30 24987/week @ 2025-10-07 23743/week @ 2025-10-14 21251/week @ 2025-10-21

106,115 downloads per month
Used in 159 crates (48 directly)

MIT license

100KB
1.5K SLoC

genawaiter

crate-badge docs-badge ci-badge

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., Streams)
  • 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 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;
    }
});

See the docs for more.

Dependencies

~0–260KB