tenderowls / moorka

ABANDONED
21 stars 5 forks source link

FSM.once doesn't work #89

Open vsuharnikov opened 8 years ago

vsuharnikov commented 8 years ago

Example:

import moorka._

import scala.concurrent._
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global
import java.util.{Timer, TimerTask}

import scala.concurrent.Promise

val timer = new Timer(true)

// === Essence
def fsm = FSM(0) {
  case 5 ⇒ Dummy
  case x ⇒ after(1 second).toRx.map { _ ⇒
    println(s"x: $x")
    x + 1
  }
}

// Will not print anything
fsm once println

// Will print "0"
fsm flatMap { x ⇒
  println(x)
  Killer
}

// === /Essence

def after(timeout: FiniteDuration): Future[Unit] = {
  val p = Promise[Unit]()
  val task = new TimerTask {
    override def run(): Unit = {
      p.success(())
    }
  }

  timer.schedule(task, timeout.toMillis)

  p.future
}