1个不稳定版本
0.1.0 | 2020年10月23日 |
---|
#1954 在 异步
4,974 每月下载
用于 4 个crate(3 个直接使用)
7KB
52 行
生成器仍然不稳定,生成流需要复杂的所有权处理,因此这个crate旨在实现流的自定义生成。
当前的异步实现尝试通过宏提供 yield
语法,但在此库创建时,这并不对IDE透明,因此 gen_z
尝试以IDE理解的方式工作。
gen_z(|mut z| async move {
let awaited = bar().await; // Make awaitable calls in the generator
z.send(awaited).await; // Streams do not support responses; `yield` has output `()`
// Share yield helper with calls, allowing them to emit outputs while producing values
let shared_result = baz(&mut z).await;
z.send(foo + shared_result).await;
// Return is infallible; if `Result` is needed, wrap calls to comply with TryStream
}) // => Result is a futures::stream::Stream<Item = T>
- 对于
Stream::Item
,需要Send
。- 如果提供的future也是
Send
,则流是Send
。
- 如果提供的future也是
- 如果
Stream::Item
和 future 都为Sync
,则可用Sync
。 - 生成器只需要
FnOnce
,因此它可以捕获可变引用。 - 可以通过在提供的future中循环来生成无限流
- 生成器是不可出错的;给定的future必须返回
()
、无限运行或panic。- 要使用
Result<_, _>
,创建一个返回Result
的内部future,并将Err
返回转换为与Stream::Item
兼容的类型。通过将Stream::Item
类型设置为Result<T, TErr>
,可以实现TryStream
兼容性。
- 要使用
依赖项
~1MB
~15K SLoC