Если список большой, вы можете использовать Stream , например:
import cats.effect.{Blocker, ContextShift, IO, Sync}
import fs2.Stream
import io.circe.Encoder
import io.circe.syntax._
import java.nio.file.{Path, Paths}
def writeToFileAsJsons[A : Encoder, F[_] : Sync : ContextShift](data: List[A], path: Path, blocker: Blocker): F[Unit] =
Stream
.emits(data)
.covary[F]
.map(_.asJson.noSpaces)
.through(fs2.text.utf8Encode)
.through(fs2.io.file.writeAll(path, blocker))
.compile
.drain
И вызвать метод, например:
val program: IO[Unit] =
Blocker[IO].use { blocker =>
writeToFileAsJsons[Int, IO](
data = List(1, 2, 3),
path = Paths.get("foo", "bar.txt"),
blocker
)
}
( пока есть ContextShift для IO
в области действия)
Если список действительно большой, вы можете захотеть иметь Stream с самого начала, а если он не такой большой, не беспокойтесь об этом слишком сильно.