2

私は 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 回入力する必要があります。

問題は、プロセスが時間通りに失敗した場合、コンソール入力のブロックが解除されず (強制終了されず)、ユーザーの入力を待機していることです。

私は先物でそれを再現しようとしましたが、同じ問題に直面しました。

ありがとうございました。

4

1 に答える 1