29190
|
1 |
/* Title: Pure/General/event_bus.scala
|
|
2 |
Author: Makarius
|
|
3 |
|
29200
|
4 |
Generic event bus with multiple handlers and optional exception
|
|
5 |
logging.
|
29190
|
6 |
*/
|
|
7 |
|
|
8 |
package isabelle
|
|
9 |
|
29191
|
10 |
import scala.collection.mutable.ListBuffer
|
29190
|
11 |
|
|
12 |
|
29200
|
13 |
class EventBus[Event]
|
|
14 |
{
|
|
15 |
/* event handlers */
|
|
16 |
|
29190
|
17 |
type Handler = Event => Unit
|
29191
|
18 |
private val handlers = new ListBuffer[Handler]
|
29190
|
19 |
|
29191
|
20 |
def += (h: Handler) = synchronized { handlers += h }
|
|
21 |
def + (h: Handler) = { this += h; this }
|
|
22 |
|
29190
|
23 |
def -= (h: Handler) = synchronized { handlers -= h }
|
29191
|
24 |
def - (h: Handler) = { this -= h; this }
|
29190
|
25 |
|
29200
|
26 |
|
|
27 |
/* event invocation */
|
|
28 |
|
|
29 |
var logger: Throwable => Unit = throw _
|
|
30 |
|
|
31 |
def event(x: Event) = {
|
|
32 |
val log = logger
|
|
33 |
for (h <- synchronized { handlers.toList }) {
|
|
34 |
try { h(x) }
|
|
35 |
catch { case e: Throwable => log(e) }
|
|
36 |
}
|
|
37 |
}
|
29190
|
38 |
}
|