author | wenzelm |
Thu, 24 Apr 2014 10:33:06 +0200 | |
changeset 56689 | b8b8b4ff8ad5 |
parent 56688 | f3932166a33d |
permissions | -rw-r--r-- |
38428
c13c95c97e89
event_bus.scala rather belongs to system plumbing;
wenzelm
parents:
36676
diff
changeset
|
1 |
/* Title: Pure/System/event_bus.scala |
45673
cd41e3903fbf
separate compilation of PIDE vs. Pure sources, which enables independent Scala library;
wenzelm
parents:
45667
diff
changeset
|
2 |
Module: PIDE |
29190 | 3 |
Author: Makarius |
4 |
||
32539 | 5 |
Generic event bus with multiple receiving actors. |
29190 | 6 |
*/ |
7 |
||
8 |
package isabelle |
|
9 |
||
55618 | 10 |
|
32539 | 11 |
import scala.actors.Actor, Actor._ |
29190 | 12 |
|
13 |
||
32539 | 14 |
class Event_Bus[Event] |
29200 | 15 |
{ |
32539 | 16 |
/* receivers */ |
17 |
||
56686 | 18 |
private val receivers = Synchronized(List.empty[Actor]) |
32539 | 19 |
|
56688 | 20 |
def += (r: Actor) { receivers.change(Library.insert(r)) } |
29200 | 21 |
|
32539 | 22 |
def += (f: Event => Unit) { |
43406
40c67d894be4
avoid compiler warning -- this is unchecked anyway;
wenzelm
parents:
38849
diff
changeset
|
23 |
this += actor { loop { react { case x => f(x.asInstanceOf[Event]) } } } |
32539 | 24 |
} |
29190 | 25 |
|
56688 | 26 |
def -= (r: Actor) { receivers.change(Library.remove(r)) } |
29190 | 27 |
|
29200 | 28 |
|
29 |
/* event invocation */ |
|
30 |
||
56689 | 31 |
def event(x: Event) { receivers.value.iterator.foreach(_ ! x) } |
29190 | 32 |
} |