Ich habe den folgenden Code, der die Reader
Monade für die Konfiguration verwendet und hat auch mit IO[Option[String]]
zu tun, und ich habe mit Code, der Treppenstufen in meinem encode
Funktion endete.Wie vermeidet man Tread-Stepping mit Monad Transformers in Scala?
Wie kann ich eine Monade Transformator für Reader
und OptionT
formulieren die hässlichen verschachtelten for
Comprehensions in meiner encode
Funktion zu vermeiden?
def encode(fileName: String): Reader[Config, IO[Unit]] = for {
ffmpegWrapper <- findFfmpegWrapper
ffmpegBin <- findFfmpeg
} yield (for {
w <- ffmpegWrapper
b <- ffmpegBin
stream <- callFfmpeg(getCommand(w, b, fileName)).liftM[OptionT]
} yield stream) map (_ foreach (println)) getOrElse Unit.box {}
def getCommand(ffmpegWrapper: String, ffmpegBin: String,
videoFile: String) = s"$ffmpegWrapper $ffmpegBin $videoFile '-vcodec libx264 -s 1024x576' /tmp/out.mp4"
def callFfmpeg(command: String): IO[Stream[String]] = IO {
Process(command).lines_!
}
def findFile(path:List[String]): OptionT[IO,String] = OptionT[IO,String](IO{path.find(new File(_).exists)})
def findFfmpeg:Reader[Config, OptionT[IO,String]] = Reader {c=>findFile(c.ffmpegLocations)}
def findFfmpegWrapper:Reader[Config, OptionT[IO,String]] = Reader {c=>findFile(c.ffmpegWrapperLocations)}
Vielen Dank!
Ich war dabei, eine fast identische Antwort zu schreiben, als Ihre erschien. Ich habe den oberen Teil Ihrer Antwort mit etwas, das in meinem, aber nicht in Ihrem war, über den Reader = ReaderT-Typ-Alias ergänzt, bitte zögern Sie nicht, es zu entfernen, wenn Sie denken, es nicht zu Ihrer Antwort hinzuzufügen :) – stew
@stew: Danke ! Ich habe gerade einen Link zu der Quelle hinzugefügt, die Sie erwähnt haben. –
Travis und @stew das ist unglaublich hilfreich! Probier es einfach aus. – cwmyers