मेरे पास निम्न कोड है जो Reader
कॉन्फ़िगरेशन के लिए मोनैड का उपयोग करता है और IO[Option[String]]
से निपटने के लिए भी है और मैंने अपने encode
फ़ंक्शन में सीढ़ी-चरण कोड के साथ समाप्त कर दिया है।स्कैला में मोनाड ट्रांसफॉर्मर्स के साथ सीढ़ी-कदम से कैसे बचें?
मैं Reader
और OptionT
के लिए एक इकाई के ट्रांसफार्मर मेरी encode
समारोह में बदसूरत नेस्टेड for
comprehensions से बचने के लिए कैसे तैयार कर सकते हैं?
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)}
धन्यवाद!
मैं आपका दिखाई देने पर एक समान उत्तर लिखने की प्रक्रिया में था। मैंने आपके उत्तर के शीर्ष में कुछ ऐसा किया जो मेरे अंदर था लेकिन रीडर = रीडर टी प्रकार उपनाम दिखाने के बारे में आपके अंदर नहीं है, अगर आपको लगता है कि यह आपके उत्तर में नहीं जुड़ा है तो कृपया इसे निकालने में संकोच न करें :) – stew
@stew: धन्यवाद ! मैंने आपके द्वारा उल्लिखित स्रोत के लिए एक लिंक जोड़ा है। –
ट्रैविस और @ स्टू यह अविश्वसनीय रूप से सहायक है! बस इसे अभी कोशिश कर रहा है। – cwmyers