#stream #async-stream #future #iterator #coroutine #yield #nightly

nightly no-std stream-future

实现带返回值的异步迭代器

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 异步

Download history 10/week @ 2024-04-14 2/week @ 2024-04-21 170/week @ 2024-05-19 41/week @ 2024-05-26 9/week @ 2024-06-02 22/week @ 2024-06-09 2/week @ 2024-06-16 9/week @ 2024-06-23 32/week @ 2024-06-30 7/week @ 2024-07-21 105/week @ 2024-07-28

每月112次下载
2 crate 中使用

MIT 协议

12KB
150

stream-future

crates.io docs.rs

这是一个兼容 no_std 的库,用于创建一个实现 StreamFuture。您可以使用 awaityield 简单地创建。

需要一个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