我真正想做的是监控多个文件,当其中任何一个文件被修改时,我想更新一些状态并使用这种状态产生副作用。我想我想要的是产生 a 的scan
a 。但我看不到那里的路径。Traversable
Traversable[IO[_]]
作为产生这个的最小尝试,我写了
package example
import better.files.{File, FileMonitor}
import cats.implicits._
import com.monovore.decline._
import cats.effect.IO
import java.nio.file.{Files, Path}
import scala.concurrent.ExecutionContext.Implicits.global
object Hello extends CommandApp(
name = "cats-effects-playground",
header = "welcome",
main = {
val filesOpts = Opts.options[Path]("input", help = "input files")
filesOpts.map { files =>
IO.async[File] { cb =>
val watchers = files.map { path =>
new FileMonitor(path, recursive = false) {
override def onModify(file: File, count: Int) = cb(Right(file))
}
}
watchers.toList.foreach(_.start)
}
.flatMap(f => IO { println(f) })
.unsafeRunSync
}
}
)
但这有两个主要缺陷。它为我正在观看的每个文件创建一个线程,这有点重。但更重要的是,一旦修改了单个文件,程序就会结束,即使onModify
如果程序保持运行,它会被调用更多次。
我不喜欢使用更好的文件,这似乎是阻力最小的路径。但我确实需要使用 Cats IO。