ZIO,入门,纯功能下载器

ZIO, Getting started, pure functional downloader

我有一个简单的程序,或多或少是一个下载器。它收集一个或多个可配置资源(通过自定义协议),聚合并将它们写入到位。

这个程序看起来很简单,但代码仍然很复杂,并且混合了功能代码和过程代码(来自我的 Java 背景)。我想简化它并转向功能齐全的。我正在阅读有关 ZIO 的文章,整个画面开始在我脑海中浮现。

但是,在阅读了入门和概述之后,我仍然有一些疑问。

主要流程可能是这样的:

for {
  config    <- Configuration.parse(args)
  resources <- Downloaders.download(config)
  _         <- Writer.write(resources)
} yield ()
  1. 我想包含静态值但也包含一个 http 客户端的配置将被放入 ZIO Environment

  2. 下载器可能是未来构建的效果器,可能会使用 ZIO bracket 关闭连接。我想我可以用 fold 汇总结果。但我不知道如何创建和执行许多下载器。
    已编辑 a) 由于 Future 是纯音符,我如何建模一个将 运行 异步的效果(我打算使用 Play Standalone WS客户) ?
    已编辑 b) 我应该为每个目标创建一个下载器,请求将分配给它们。但是我应该如何在我的代码中实现它?我应该创建一个 ZIO[Configuration, Throwable, List[Downloader]] ,然后通过 collectAllPar 执行所有这些吗?

  3. 我不知道如何将聚合写入磁盘。

我想用这个项目在内部推广 ZIO。所以我想使用最好的选择和最干净的方法。有人可以给我一些关于如何实现这些效果和构建我的代码的提示吗? 已编辑:我应该在 ZIO 组件上构建我的系统还是构建一组函数并将它们包装到 ZIO 效果中?

非常感谢

您的问题不是很具体,这意味着不幸的是它不会吸引高质量的答案。

我仍然会尝试回答一些要点。

  • Future不纯。如果可能,请避免使用它们。
  • 您的下载程序将是一个函数 Request => ZIO[R, E, Response]。要使它们 运行 并行,请使用 ZIO.collectAllParZIO.zip。结果是 ZIO[R, E, List[A]]ZIP[R, E, TupleX[...]],您可以将其存储在 resources 中以供理解。
  • 可以使用 Scala 的 new PrintWriter(new File("hello.txt")) 将数据写入文件,您猜对了,ZIO.bracket.

如需深入了解 ZIO 的程序设计,我建议阅读 De Goes 本人的 Beautiful, Simple, Testable Functional Effects for Scala

此外,当然,请参阅 ZIO's website 上的文档。