2

I currently have the following code:

val writer: PrintWriter = ???
val linesObservable: Observable[String] = ???

val future: CancelableFuture[Unit] = linesObservable.foreach(writer.write)

writer.close()

My goal is to get rid of all side effects in the above snippet.

From a functional perspective, writer should act as resource / bracket for future.

Because I am using Monix version 3.0.0-RC2, there is new bracket methods available for Observable and Task (maybe even more classes), which could be what I'm looking for - but I don't quite see how yet.

Markus Appel
  • 3,138
  • 1
  • 17
  • 46

1 Answers1

3

Yes, you are correct. It's better to acquire PrintWriter as a resource so that it can be closed cleanly when its done writing.

val writer: Resource[Task, PrintWriter] = 
  Resource.make[Task, PrintWriter](???)(pw => Task.delay(pw.close()))

val linesObservable: Observable[String] = ???

writer.use { pw =>
  linesObservable.foreachL(pw.write)
}
atl
  • 326
  • 1
  • 9