#stream #future #value #iterator #async #yield #await

无 std stream-future-impl

实现具有返回值的异步迭代器

7 个版本 (4 个破坏性更新)

0.5.0 2024 年 5 月 21 日
0.4.0 2023 年 3 月 21 日
0.3.1 2022 年 12 月 24 日
0.3.0 2022 年 8 月 31 日
0.1.1 2022 年 8 月 26 日

#30#yield

Download history 175/week @ 2024-05-20 44/week @ 2024-05-27 7/week @ 2024-06-03 24/week @ 2024-06-10 8/week @ 2024-06-24 10/week @ 2024-07-01 7/week @ 2024-07-22 62/week @ 2024-07-29 9/week @ 2024-08-05 17/week @ 2024-08-12

每月 95 次下载
3 个 crate 中使用 (通过 stream-future)

MIT 许可证

9KB
118

stream-future

crates.io docs.rs

这是一个与 no_std 兼容的库,用于编写具有 Stream 实现的 Future。您可以使用 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);
}

您可以在属性中指定返回类型。返回类型可以是 ()。您可以简单地 await 其他 future,宏将处理它。

async-stream 进行比较

您可以返回任何您喜欢的值!调用者可以简单地 await 并获取值,而无需遍历流。

根据我们的基准测试,此库比 async-stream 快 7 倍。

依赖关系

~285–740KB
~18K SLoC