Crate async_stream

Expand description

§asynk-strim

Like async-stream but without macros. Like async-fn-stream but a little more efficient.

Features:

  • macroless API
  • one dependency (besides futures-core which I don’t count since it provides the Stream definition)
  • no_std-compatible, zero allocations

§⚠ Important

This crate adds a wrapper around the wakers that contains data and pointers needed to yield items. Crates like embassy use a similar approach and will therefore clash with us.

If you run into this issue (which will manifest as a runtime panic), you can use the unwrap_waker function. This function will wrap a future and remove the waker wrapper.

While you can’t use the yielder inside the unwrapped future, stuff like embassy should work again.

§Example

use futures_lite::stream;
use std::pin::pin;

let stream = pin!(asynk_strim::stream_fn(|mut yielder| async move {
    yielder.yield_item("hello world!").await;
    yielder.yield_item("pretty neato, ain't it?").await;
}));

let mut stream = stream::block_on(stream);
assert_eq!(stream.next(), Some("hello world!"));
assert_eq!(stream.next(), Some("pretty neato, ain't it?"));
assert_eq!(stream.next(), None);

§Comparisons

§async-stream

In comparison to async-stream we offer the following advantages:

  • no macros
  • slightly faster performance
  • no_std support

§async-fn-stream

In comparison to async-stream we offer the following advantages:

  • no allocations
  • slightly faster performance
  • no_std support

§Acknowledgements

This crate combines approaches from the following crates:

§License

Licensed under tither the MIT or Apache 2.0 license (at your choosing)

Structs§

TryYielder
Handle to allow you to yield something from the stream
Yielder
Handle to allow you to yield something from the stream

Functions§

stream_fn
Create a new stream
strim_fn
Jokey alias for stream_fn
try_stream_fn
Create a new try stream
try_strim_fn
Jokey alias for try_stream_fn
unwrap_waker
Unwrap the waker