私は Scalaz Stream ライブラリで遊んでいて、単純なコンソール アプリを作成しようとしています。
チュートリアルのscalaz ストリームに従いましたが、コンソールの読み取りと書き込みの例があります。
しかし、どうすればいいのかわからないという奇妙な問題に直面しました。
これは私のコードです:
import scala.concurrent.duration._
import scalaz.concurrent.Task
object StreamApp extends App {
(new StreamExec).go3
}
class StreamExec {
def gets: Task[String] = Task {
scala.io.StdIn.readLine()
}
def puts(ln: String, answer: String): Task[Boolean] = Task {
println(ln)
ln.contains(answer)
}
def go3 {
import scalaz.stream.Process
val q = Seq("1", "2", "3") map { case p =>
println(s"Say $p")
val in = Process eval gets
val out = in flatMap { line =>
Process eval puts(line, p)
}
out.runLog.attemptRunFor(5.seconds)
}
println(q)
}
}
実行すると、出力は次のようになります
background log: info: Say 1
1
background log: info: 1
background log: info: Say 2
background log: info: Say 3
3
3
background log: info: 3
background log: info: List(\/-(Vector(true)), -\/(java.util.concurrent.TimeoutException), \/-(Vector(true)))
1 は問題なく、2 は 5 秒後にタイムアウトになり、3 は 2 回入力する必要があります。
問題は、プロセスが時間通りに失敗した場合、コンソール入力のブロックが解除されず (強制終了されず)、ユーザーの入力を待機していることです。
私は先物でそれを再現しようとしましたが、同じ問題に直面しました。
ありがとうございました。