Yapılandırma için Reader
tekdüzenini kullanan ve IO[Option[String]]
ile uğraşmak zorunda olduğum ve encode
işlevindeki merdiven basamaklarını tamamladığım şu kodu kullanıyorum.Scala'daki Monad Transformers ile merdiven basamakları nasıl atılır?
encode
işlevinde çirkin iç içe
for
comprehensions önlemek için
Reader
ve
OptionT
için monad trafo formüle nasıl
?
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)}
Thank-you!
Seninki ortaya çıktığında hemen hemen aynı bir cevap yazma sürecindeydim. Ben senin cevabın tepesinde değiştirdim ama senin Reader değil Okuyucu = ReaderT türü takma adıyla ilgili bir şeyle değiştirilmiş, cevabınıza eklemediğini düşünüyorsanız lütfen çekinmeyin :) – stew
@stew: Teşekkürler ! Az önce bahsettiğin kaynağa bir link ekledim. –
Travis ve @stew bu inanılmaz derecede yararlı! Sadece şimdi deniyorum. – cwmyers