answerkey/streamingio/08.answer.md
def trimmed: Pipe[String, String] =
src => src.map(_.trim)
def nonComment: Pipe[String, String] =
src => src.filter(_.charAt(0) != '#')
def asDouble: Pipe[String, Double] =
src => src.flatMap: s =>
s.toDoubleOption match
case Some(d) => Stream(d)
case None => Stream()
def convertToCelsius: Pipe[Double, Double] =
src => src.map(toCelsius)
val conversion: Pipe[String, Double] =
trimmed andThen
nonEmpty andThen
nonComment andThen
asDouble andThen
convertToCelsius
import java.nio.file.{Files, Paths}
def convert(inputFile: String, outputFile: String): IO[Unit] =
IO:
val source = scala.io.Source.fromFile(inputFile)
try
val writer = Files.newBufferedWriter(Paths.get(outputFile))
try
fromIterator(source.getLines)
.pipe(conversion)
.fold(()): (_, a) =>
writer.write(a.toString)
writer.newLine()
finally writer.close()
finally source.close()