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 theStream
definition) no_std
-compatible, zero allocations
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.
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);
In comparison to async-stream
we offer the following advantages:
- no macros
- slightly faster performance
no_std
support
In comparison to async-stream
we offer the following advantages:
- no allocations
- slightly faster performance
no_std
support
This crate combines approaches from the following crates:
async-stream
async-fn-stream
- The PR by Sabrina Jewson adding a function-based API to
async-stream
- The experimental PR by Hyeonu Park using the waker-based approach
Licensed under tither the MIT or Apache 2.0 license (at your choosing)