#generator #async-await #yield #await #async #future

gen-z

通过可等待发送者通过异步生成器进行无宏流构建

1个不稳定版本

0.1.0 2020年10月23日

#1954异步

Download history 1077/week @ 2024-04-08 1353/week @ 2024-04-15 1006/week @ 2024-04-22 1392/week @ 2024-04-29 1561/week @ 2024-05-06 1421/week @ 2024-05-13 1204/week @ 2024-05-20 1138/week @ 2024-05-27 1272/week @ 2024-06-03 909/week @ 2024-06-10 891/week @ 2024-06-17 1143/week @ 2024-06-24 939/week @ 2024-07-01 1352/week @ 2024-07-08 1124/week @ 2024-07-15 1421/week @ 2024-07-22

4,974 每月下载
用于 4 个crate(3 个直接使用)

MIT/Apache

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
  • 如果 Stream::Item 和 future 都为 Sync,则可用 Sync
  • 生成器只需要 FnOnce,因此它可以捕获可变引用。
  • 可以通过在提供的future中循环来生成无限流
  • 生成器是不可出错的;给定的future必须返回 ()、无限运行或panic。
    • 要使用 Result<_, _>,创建一个返回 Result 的内部future,并将 Err 返回转换为与 Stream::Item 兼容的类型。通过将 Stream::Item 类型设置为 Result<T, TErr>,可以实现 TryStream 兼容性。

依赖项

~1MB
~15K SLoC