All Downloads are FREE. Search and download functionalities are using the official Maven repository.

japgolly.scalajs.react.callback.SyncPromise.scala Maven / Gradle / Ivy

There is a newer version: 3.0.0-beta12
Show newest version
package japgolly.scalajs.react.callback

import scala.util.Try

/** Promise that is synchronous once its value has been set. */
final class SyncPromise[A] {
  private var result    = Option.empty[Try[A]]
  private var callbacks = List.empty[Try[A] => Callback]

  val complete: Try[A] => Callback =
    t =>
      Callback {
        if (result.isEmpty) {
          result = Some(t)
          try
            callbacks.foreach(_(t).runNow())
          finally
            callbacks = Nil
        }
      }

  def onComplete: (Try[A] => Callback) => Callback =
    f =>
      Callback {
        result match {
          case Some(t) => f(t).runNow()
          case None    => callbacks :+= f
        }
      }
}

object SyncPromise {
  def apply[A]: CallbackTo[SyncPromise[A]] =
    CallbackTo(new SyncPromise)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy