/* Title: Pure/General/event_bus.scala
Author: Makarius
Generic event bus with multiple handlers and optional exception
logging.
*/
package isabelle
import scala.collection.mutable.ListBuffer
class EventBus[Event]
{
/* event handlers */
type Handler = Event => Unit
private val handlers = new ListBuffer[Handler]
def += (h: Handler) = synchronized { handlers += h }
def + (h: Handler) = { this += h; this }
def -= (h: Handler) = synchronized { handlers -= h }
def - (h: Handler) = { this -= h; this }
/* event invocation */
var logger: Throwable => Unit = throw _
def event(x: Event) = {
val log = logger
for (h <- synchronized { handlers.toList }) {
try { h(x) }
catch { case e: Throwable => log(e) }
}
}
}