#generator #yield #async-await #语法 #实现 # #特性

no-std remit

Rust 通过 async/await 语法实现的生成器

4 个版本

0.1.4 2023 年 8 月 17 日
0.1.3 2023 年 7 月 27 日
0.1.2 2023 年 7 月 27 日
0.1.1 2023 年 5 月 30 日
0.1.0 2023 年 5 月 30 日

#704Rust 模式

每月 48 次下载

MIT/Apache

26KB
379

Remit

Crates.io version docs.rs status Crates.io license

Rust 通过 async/await 语法实现的生成器。

固定实现基于栈,而包装实现基于堆。无花哨宏和简单的 API。值可以懒惰或积极产生。

此crate天生为no-std,默认的alloc功能可以被禁用。

缺少alloc所表现的一些行为不是 SemVer 的部分。例如,在没有 alloc 的情况下,在另一个 remit 之前不等待是不确定的。

使用

添加到依赖项

[dependencies]
remit = "0.1.1"

示例代码

use std::pin::pin;
use remit::{Generator, Remit};

async fn gen(remit: Remit<'_, usize>) {
    remit.value(42).await;
    // Does not need to be limited
    for i in 1.. {
        remit.value(i).await
    }
}
for item in pin!(Generator::new()).of(gen).take(10) {
    println!("{item}");
    // Prints 42, 1, 2, 3, 4, 5, 6, 7, 8, 9
}
assert_eq!(vec![42, 1, 2, 3], pin!(Generator::new()).of(gen).take(4).collect::<Vec<_>>());
/* // Rust has trouble determining the lifetime
assert_eq!(
    vec![1],
    pin!(Generator::new())
        .of(|remit: Remit<'_, usize>| async move { remit.value(1).await; })
        .collect::<Vec<_>>(),
);
*/
assert_eq!(vec![42, 1], Generator::boxed(gen).take(2).collect::<Vec<_>>());
assert_eq!(vec![1], Generator::boxed(|remit| async move { remit.value(1).await; }).collect::<Vec<_>>());

fn iter() -> impl Iterator<Item=usize> {
    Generator::boxed(gen)
}

async fn scream<D: std::fmt::Display>(iter: impl Iterator<Item=D>, remit: Remit<'_, String>) {
    for person in iter {
        remit.value(format!("{person} scream!")).await
    }
    remit.value("... for ice cream!".to_string());
}
let expected: Vec<String> = ["You scream!", "I scream!", "We all scream!", "... for ice cream!"].iter().map(ToString::to_string).collect();
assert_eq!(
    expected,
    pin!(Generator::new()).parameterized(scream, ["You", "I", "We all"].iter()).collect::<Vec<String>>(),
);
assert_eq!(
    expected,
    Generator::boxed(|remit| scream(["You", "I", "We all"].iter(), remit)).collect::<Vec<String>>(),
);

许可证

MIT 或 APACHE-2,任选其一。

参见相应的 LICENSE 文件。

无运行时依赖

功能