Tôi cố gắng để viết hàm sauNgăn chặn một Process [Task, O] trên người dùng nhập vào
def haltOnUserInput[O](process: Process[Task, O]): Process[Task, O]
mà dừng process
khi người dùng gửi một dòng trên stdin
. Trong trường hợp này, bạn có thể đợi quá trình tính toán hiện tại trong quá trình kết thúc, trước khi kết thúc quá trình.
Tôi đã thử những điều sau đây:
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
}
}
Và tôi đang thử nghiệm như thế:
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] = [email protected]
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
Như bạn thấy, đầu vào người dùng được thừa nhận ("ở đây" được in, nhiều lần) nhưng Quy trình không bị gián đoạn. Tôi không chắc chắn nếu flatMap
hoạt động như dự kiến wrt Process.halt
.
Bất kỳ cách nào về cách viết haltOnUserInput
chính xác?
câu hỏi thực tế đây – Daenyth
@Daenyth tôi đã thực hiện các câu hỏi rõ ràng là gì: làm thế nào để viết 'haltOnUserInput' chính xác? – betehess