Scala 在用户输入时停止进程[任务,O]

Scala 在用户输入时停止进程[任务,O],scala,scalaz,scalaz-stream,Scala,Scalaz,Scalaz Stream,我正在尝试编写以下函数 def haltOnUserInput[O](process: Process[Task, O]): Process[Task, O] 当用户在stdin上发送一条线路时,它会停止过程。在这种情况下,可以先等待流程中的当前计算结束,然后再结束流程本身 我尝试了以下方法: scala> :paste // Entering paste mode (ctrl-D to finish) import scalaz.{ -\/, \/-, \/ } import sca

我正在尝试编写以下函数

def haltOnUserInput[O](process: Process[Task, O]): Process[Task, O]
当用户在
stdin
上发送一条线路时,它会停止
过程。在这种情况下,可以先等待流程中的当前计算结束,然后再结束流程本身

我尝试了以下方法:

scala> :paste
// Entering paste mode (ctrl-D to finish)

import scalaz.{ -\/, \/-, \/ }
import scalaz.stream._
import scalaz.concurrent.Task

def haltOnUserInput[O](process: Process[Task, O]): Process[Task, O] = {
  process.either(io.stdInLines).flatMap {
    case -\/(o) => Process.emit(o)
    case \/-(_) => println("here"); Process.halt
  }
}
我是这样测试的:

scala> val oneSec = scala.concurrent.duration.Duration("1s")
oneSec: scala.concurrent.duration.Duration = 1 second

scala> val test = haltOnUserInput(Process.awakeEvery(oneSec)).take(10).map(_.toString).to(io.stdOutLines).run
test: scalaz.concurrent.Task[Unit] = scalaz.concurrent.Task@7a5e41bb

scala> test.run
1000144294 nanoseconds
2000148316 nanoseconds
here
3000130736 nanoseconds
here
4000124898 nanoseconds
5000189134 nanoseconds
6000201269 nanoseconds
here
7000127797 nanoseconds
8000132194 nanoseconds
9000191001 nanoseconds
10000126974 nanoseconds
如您所见,用户输入得到确认(“此处”打印了几次),但过程没有中断。我不确定
flatMap
是否按预期运行wrt
Process.halt


如何正确编写haltOnUserInput?

以下是我对haltOnUserInput的实现:

  def haltOnUserInput[O](process: Process[Task, O]): Process[Task, O] = {
     val stop = Process.constant(()) either io.stdInLines map (_.isRight)
     process.until(stop)
   }

另一种解决方案是使用wye.interrupt:

val input = io.stdInLines.take(1).map(_ => true)
val dory = Process.awakeEvery(1.second).map(_ => println("Hi!"))
val process = input.wye(dory)(wye.interrupt)
process.run.run

真正的问题是什么here@Daenyth我已经明确提出了这个问题:如何正确编写
haltOnUserInput
?这很好!顺便说一句,
.take(1)
在这里是无用的。这个答案帮助了我,谢谢。可能需要此更改: