Show that a callback runs after work is ready.

callback-order A callback is code saved for a later state. The replay keeps the idea deterministic by changing local state instead of starting a background task.

Callback Order

done
CallbackOrder.scala
Replay: real traced execution (multi-file project)
object Main {
  def main(args: Array[String]): Unit = {
    val done = true
    var log = "scheduled"
    var state = "waiting"

    if (done) {
      log = log + ">callback"
      state = "updated"
    }

    println("log=" + log)
    println("state=" + state)
  }
}
object Main {
  def main(args: Array[String]): Unit = {
    val done = false
    var log = "scheduled"
    var state = "waiting"

    if (done) {
      log = log + ">callback"
      state = "updated"
    }

    println("log=" + log)
    println("state=" + state)
  }
}
  1. done ← true, log ← scheduled, state ← waiting

    1object Main {2  def main(args: Array[String]): Unit = {3    val done→ true = true //@done=false4    var log→ scheduled = "scheduled"5    var state→ waiting = "waiting"67    if (done) {
  2. log ← scheduled>callback, state ← updated

    7if (donetrue) {8  log→ scheduled>callback = log + ">callback"9  state→ updated = "updated"10}
  3. println("log=" + log)

    12    println("log=" + logscheduled>callback)13    println("state=" + stateupdated)14  }15}
    outputlog=scheduled>callback
    state=updated
  1. done ← false, log ← scheduled, state ← waiting

    1object Main {2  def main(args: Array[String]): Unit = {3    val done→ false = false4    var log→ scheduled = "scheduled"5    var state→ waiting = "waiting"67    if (done) {8      log = log + ">callback"9      state = "updated"10    }1112    println("log=" + logscheduled)13    println("state=" + statewaiting)14  }15}
    outputlog=scheduled
    state=waiting