Back to Fpinscala

08.Answer

answerkey/streamingio/08.answer.md

latest982 B
Original Source
scala
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()