2014-07-16 12 views
6

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?

+0

Qual è la domanda reale qui – Daenyth

+0

@Daenyth ho fatto la domanda esplicita: come scrivere 'haltOnUserInput' correttamente? – betehess

risposta

4

Un'altra soluzione è quella di utilizzare 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 
+0

Che bello! A proposito, il '.take (1)' è inutile qui. – betehess

+0

Questa risposta mi ha aiutato, grazie. Potrebbe essere necessario questo cambiamento: http://stackoverflow.com/questions/32852039/why-awakeevery-was-removed-from-scalaz-stream –

1

Qui è la mia realizzazione di haltOnUserInput:

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