4 个版本
0.1.4 | 2023 年 8 月 17 日 |
---|---|
0.1.3 | 2023 年 7 月 27 日 |
0.1.2 |
|
0.1.1 | 2023 年 5 月 30 日 |
0.1.0 | 2023 年 5 月 30 日 |
#704 在 Rust 模式
每月 48 次下载
26KB
379 行
Remit
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 文件。