sto cercando di scrivere la seguente funzioneArrestare un processo [task, O] all'input dell'utente
def haltOnUserInput[O](process: Process[Task, O]): Process[Task, O]
che arresta process
quando l'utente invia una linea su stdin
. In questo scenario, è ok attendere che il calcolo corrente nel processo finisca, prima di terminare il processo stesso.
Ho provato quanto segue:
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
}
}
E sto testando così:
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
Come si può vedere, l'input utente viene confermato ("qui" è stato stampato, più volte) ma il processo non è interrotto. Non sono sicuro che se flatMap
si comporti come previsto, Process.halt
.
Qualche suggerimento su come scrivere haltOnUserInput
correttamente?
Qual è la domanda reale qui – Daenyth
@Daenyth ho fatto la domanda esplicita: come scrivere 'haltOnUserInput' correttamente? – betehess