scala.collection.mutable.ObservableMap.scala Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of scala-library Show documentation
Show all versions of scala-library Show documentation
Standard library for the Scala Programming Language
/* __ *\
** ________ ___ / / ___ Scala API **
** / __/ __// _ | / / / _ | (c) 2003-2013, LAMP/EPFL **
** __\ \/ /__/ __ |/ /__/ __ | **
** /____/\___/_/ |_/____/_/ | | **
** |/ **
\* */
package scala.collection
package mutable
import script._
/** This class is typically used as a mixin. It adds a subscription
* mechanism to the `Map` class into which this abstract
* class is mixed in. Class `ObservableMap` publishes
* events of the type `Message`.
*
* @author Matthias Zenger
* @author Martin Odersky
* @version 2.0, 31/12/2006
* @since 1
*/
trait ObservableMap[A, B] extends Map[A, B] with Publisher[Message[(A, B)] with Undoable]
{
type Pub <: ObservableMap[A, B]
abstract override def += (kv: (A, B)): this.type = {
val (key, value) = kv
get(key) match {
case None =>
super.+=(kv)
publish(new Include((key, value)) with Undoable {
def undo = -=(key)
})
case Some(old) =>
super.+=(kv)
publish(new Update((key, value)) with Undoable {
def undo = +=((key, old))
})
}
this
}
abstract override def -= (key: A): this.type = {
get(key) match {
case None =>
case Some(old) =>
super.-=(key)
publish(new Remove((key, old)) with Undoable {
def undo = update(key, old)
})
}
this
}
abstract override def clear(): Unit = {
super.clear
publish(new Reset with Undoable {
def undo(): Unit = throw new UnsupportedOperationException("cannot undo")
})
}
}