canonical list operations, as in ML;
authorwenzelm
Thu, 24 Apr 2014 00:29:55 +0200
changeset 56686 2386d1a3ca8f
parent 56685 535d59d4ed12
child 56687 7fb98325722a
canonical list operations, as in ML; avoid odd mutable data structures;
src/Pure/System/event_bus.scala
src/Pure/library.scala
--- a/src/Pure/System/event_bus.scala	Thu Apr 24 00:27:06 2014 +0200
+++ b/src/Pure/System/event_bus.scala	Thu Apr 24 00:29:55 2014 +0200
@@ -9,29 +9,24 @@
 
 
 import scala.actors.Actor, Actor._
-import scala.collection.mutable.ListBuffer
 
 
 class Event_Bus[Event]
 {
   /* receivers */
 
-  private val receivers = new ListBuffer[Actor]
+  private val receivers = Synchronized(List.empty[Actor])
 
-  def += (r: Actor) { synchronized { receivers += r } }
-  def + (r: Actor): Event_Bus[Event] = { this += r; this }
+  def += (r: Actor) { receivers >> (rs => Library.insert(r, rs)) }
 
   def += (f: Event => Unit) {
     this += actor { loop { react { case x => f(x.asInstanceOf[Event]) } } }
   }
 
-  def + (f: Event => Unit): Event_Bus[Event] = { this += f; this }
-
-  def -= (r: Actor) { synchronized { receivers -= r } }
-  def - (r: Actor) = { this -= r; this }
+  def -= (r: Actor) { receivers >> (rs => Library.remove(r, rs)) }
 
 
   /* event invocation */
 
-  def event(x: Event) { synchronized { receivers.foreach(_ ! x) } }
+  def event(x: Event) { receivers().reverseIterator.foreach(_ ! x) }
 }
--- a/src/Pure/library.scala	Thu Apr 24 00:27:06 2014 +0200
+++ b/src/Pure/library.scala	Thu Apr 24 00:29:55 2014 +0200
@@ -153,6 +153,14 @@
   }
 
 
+  /* canonical list operations */
+
+  def member[A, B](x: B, xs: List[A]): Boolean = xs.exists(_ == x)
+  def insert[A](x: A, xs: List[A]): List[A] = if (member(x, xs)) xs else x :: xs
+  def remove[A, B](x: B, xs: List[A]): List[A] = if (member(x, xs)) xs.filterNot(_ == x) else xs
+  def update[A](x: A, xs: List[A]): List[A] = x :: remove(x, xs)
+
+
   /* Java futures */
 
   def future_value[A](x: A) = new JFuture[A]