#generator #async #cute #little #async-await #stable #done

dedenne

使用稳定 Rust 中的 async/await 的可爱小生成器

1 个不稳定发布

0.1.0 2023 年 7 月 17 日

#1343 in 游戏开发

MIT 许可证

23KB
451

德登内

可爱的小生成器!

德登内实现了生成器,类似于 不稳定语言特性,完全在稳定的 Rust 中通过 async/await 实现。

简单用法

use dedenne::*;

let mut generator = Generator::new(|y, init| async move {
  for x in 0..init {
    y.ield(x).await;
  }
  for x in (0..init).rev() {
    y.ield(x).await;
  }

  "All done!"
});

assert_eq!(
  generator.start(3), GeneratorResponse::Yielding(0)
);
assert_eq!(
  generator.resume(), GeneratorResponse::Yielding(1)
);
assert_eq!(
  generator.resume(), GeneratorResponse::Yielding(2)
);
assert_eq!(
  generator.resume(), GeneratorResponse::Yielding(2)
);
assert_eq!(
  generator.resume(), GeneratorResponse::Yielding(1)
);
assert_eq!(
  generator.resume(), GeneratorResponse::Yielding(0)
);
assert_eq!(
  generator.resume(), GeneratorResponse::Done("All done!")
);

对于更大的示例,请查看这个简单的 TUI 界面

panic! vs unreachable!

如果德登内中某处 panic!,那么这是一个用户错误。请确保您已经 await 了您的 y.yield,并且在生成器耗尽后不要调用 resume

如果德登内中某处使用 unreachable! 消息引发恐慌,那么 这是一个德登内的问题。如果确实如此,请提交一个错误报告。

已有技术

我不是第一个有这个想法的人。然而,我认为德登内是唯一一个支持映射迭代器的库。

  • generator。不支持起始参数,这意味着您不能将其用作映射迭代器。总是堆栈性的。
  • genawaiter。有一些便利的宏,使生成器更容易使用。还允许您真正调整生成器的存储方式(堆栈性或分配性)。
  • 不稳定语言特性。据我所知,不支持传递值到生成器中。也要求使用 nightly Rust,并且自写作时起已经讨论了 6 年。

依赖关系

~1.5MB
~35K SLoC