src/Pure/System/event_bus.scala
author wenzelm
Thu, 24 Apr 2014 10:33:06 +0200
changeset 56689 b8b8b4ff8ad5
parent 56688 f3932166a33d
permissions -rw-r--r--
retain canonical reverse order;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
89217ccfd130 Generic event bus.
wenzelm
parents:
diff changeset
     3
    Author:     Makarius
89217ccfd130 Generic event bus.
wenzelm
parents:
diff changeset
     4
32539
668052c4220e modernized Event_Bus -- based on actors;
wenzelm
parents: 29200
diff changeset
     5
Generic event bus with multiple receiving actors.
29190
89217ccfd130 Generic event bus.
wenzelm
parents:
diff changeset
     6
*/
89217ccfd130 Generic event bus.
wenzelm
parents:
diff changeset
     7
89217ccfd130 Generic event bus.
wenzelm
parents:
diff changeset
     8
package isabelle
89217ccfd130 Generic event bus.
wenzelm
parents:
diff changeset
     9
55618
995162143ef4 tuned imports;
wenzelm
parents: 45673
diff changeset
    10
32539
668052c4220e modernized Event_Bus -- based on actors;
wenzelm
parents: 29200
diff changeset
    11
import scala.actors.Actor, Actor._
29190
89217ccfd130 Generic event bus.
wenzelm
parents:
diff changeset
    12
89217ccfd130 Generic event bus.
wenzelm
parents:
diff changeset
    13
32539
668052c4220e modernized Event_Bus -- based on actors;
wenzelm
parents: 29200
diff changeset
    14
class Event_Bus[Event]
29200
787ba47201c7 optional exception logging;
wenzelm
parents: 29191
diff changeset
    15
{
32539
668052c4220e modernized Event_Bus -- based on actors;
wenzelm
parents: 29200
diff changeset
    16
  /* receivers */
668052c4220e modernized Event_Bus -- based on actors;
wenzelm
parents: 29200
diff changeset
    17
56686
2386d1a3ca8f canonical list operations, as in ML;
wenzelm
parents: 55618
diff changeset
    18
  private val receivers = Synchronized(List.empty[Actor])
32539
668052c4220e modernized Event_Bus -- based on actors;
wenzelm
parents: 29200
diff changeset
    19
56688
f3932166a33d more canonical list operations;
wenzelm
parents: 56687
diff changeset
    20
  def += (r: Actor) { receivers.change(Library.insert(r)) }
29200
787ba47201c7 optional exception logging;
wenzelm
parents: 29191
diff changeset
    21
32539
668052c4220e modernized Event_Bus -- based on actors;
wenzelm
parents: 29200
diff changeset
    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
668052c4220e modernized Event_Bus -- based on actors;
wenzelm
parents: 29200
diff changeset
    24
  }
29190
89217ccfd130 Generic event bus.
wenzelm
parents:
diff changeset
    25
56688
f3932166a33d more canonical list operations;
wenzelm
parents: 56687
diff changeset
    26
  def -= (r: Actor) { receivers.change(Library.remove(r)) }
29190
89217ccfd130 Generic event bus.
wenzelm
parents:
diff changeset
    27
29200
787ba47201c7 optional exception logging;
wenzelm
parents: 29191
diff changeset
    28
787ba47201c7 optional exception logging;
wenzelm
parents: 29191
diff changeset
    29
  /* event invocation */
787ba47201c7 optional exception logging;
wenzelm
parents: 29191
diff changeset
    30
56689
b8b8b4ff8ad5 retain canonical reverse order;
wenzelm
parents: 56688
diff changeset
    31
  def event(x: Event) { receivers.value.iterator.foreach(_ ! x) }
29190
89217ccfd130 Generic event bus.
wenzelm
parents:
diff changeset
    32
}