8个版本 (4个破坏性更新)
0.5.0 | 2024年5月21日 |
---|---|
0.4.1 | 2023年10月24日 |
0.4.0 | 2023年3月21日 |
0.3.1 | 2022年12月24日 |
0.1.1 | 2022年8月26日 |
#1252 in 异步
每月112次下载
在 2 crate 中使用
12KB
150 行
stream-future
这是一个兼容 no_std
的库,用于创建一个实现 Stream
的 Future
。您可以使用 await
和 yield
简单地创建。
需要一个nightly功能 coroutines
。
#![feature(coroutines)]
use stream_future::stream;
#[derive(Debug)]
enum Prog {
Stage1,
Stage2,
}
#[stream(Prog)]
async fn foo() -> Result<i32> {
yield Prog::Stage1;
// some works...
yield Prog::Stage2;
// some other works...
Ok(0)
}
use tokio_stream::StreamExt;
let bar = foo();
tokio::pin!(bar);
while let Some(prog) = bar.next().await {
println!("{:?}", prog);
}
let bar = bar.await?;
assert_eq!(bar, 0);
#![feature(coroutines)]
use stream_future::try_stream;
#[derive(Debug)]
enum Prog {
Stage1,
Stage2,
}
#[try_stream(Prog)]
async fn foo() -> Result<()> {
yield Prog::Stage1;
// some works...
yield Prog::Stage2;
// some other works...
Ok(())
}
let bar = foo();
tokio::pin!(bar);
while let Some(prog) = bar.try_next().await? {
println!("{:?}", prog);
}
您可以在属性中指定yield类型。yield类型或返回类型可以是 ()
。您可以简单地 await
其他future,并且宏将处理这些。
与 async-stream
比较
您可以返回任何您喜欢的值!调用者可以简单地 await
并获取值,而无需遍历流。
根据我们的基准测试,这个库比 async-stream
快7倍。
依赖
~0.3–0.8MB
~18K SLoC