summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksandar Pokopec <aleksandar.prokopec@epfl.ch>2010-09-27 09:38:01 +0000
committerAleksandar Pokopec <aleksandar.prokopec@epfl.ch>2010-09-27 09:38:01 +0000
commitdace259b47121450b1b5156587dd5d3c9193c82a (patch)
tree9fd0bf9360ed83791f94679ea1bbfce1d8847d13
parent24a9ae5a42936afc665a9059adb37f38b59b87e5 (diff)
downloadscala-dace259b47121450b1b5156587dd5d3c9193c82a.tar.gz
scala-dace259b47121450b1b5156587dd5d3c9193c82a.tar.bz2
scala-dace259b47121450b1b5156587dd5d3c9193c82a.zip
Fixes #3829. Review by extempore.
-rw-r--r--src/library/scala/collection/Map.scala18
-rw-r--r--src/library/scala/collection/immutable/Map.scala17
-rw-r--r--src/library/scala/collection/mutable/Map.scala16
3 files changed, 34 insertions, 17 deletions
diff --git a/src/library/scala/collection/Map.scala b/src/library/scala/collection/Map.scala
index b48acd0c4e..ccf58b5a0b 100644
--- a/src/library/scala/collection/Map.scala
+++ b/src/library/scala/collection/Map.scala
@@ -30,6 +30,12 @@ import generic._
*/
trait Map[A, +B] extends Iterable[(A, B)] with MapLike[A, B, Map[A, B]] {
def empty: Map[A, B] = Map.empty
+
+ /** The same map with a given default function !!! todo: move to general maps? */
+ def withDefault[B1 >: B](d: A => B1): Map[A, B1] = new Map.WithDefault[A, B1](this, d)
+
+ /** The same map with a given default value */
+ def withDefaultValue[B1 >: B](d: B1): Map[A, B1] = new Map.WithDefault[A, B1](this, x => d)
}
/** $factoryInfo
@@ -41,4 +47,16 @@ object Map extends MapFactory[Map] {
/** $mapCanBuildFromInfo */
implicit def canBuildFrom[A, B]: CanBuildFrom[Coll, (A, B), Map[A, B]] = new MapCanBuildFrom[A, B]
+
+ class WithDefault[A, +B](underlying: Map[A, B], d: A => B) extends Map[A, B] {
+ override def size = underlying.size
+ def get(key: A) = underlying.get(key) orElse Some(default(key))
+ def iterator = underlying.iterator
+ override def empty = new WithDefault(underlying.empty, d)
+ override def updated[B1 >: B](key: A, value: B1): WithDefault[A, B1] = new WithDefault[A, B1](underlying.updated[B1](key, value), d)
+ override def + [B1 >: B](kv: (A, B1)): WithDefault[A, B1] = updated(kv._1, kv._2)
+ def - (key: A): WithDefault[A, B] = new WithDefault(underlying - key, d)
+ override def default(key: A): B = d(key)
+ }
+
}
diff --git a/src/library/scala/collection/immutable/Map.scala b/src/library/scala/collection/immutable/Map.scala
index c65fb170cc..ef1f6b60ed 100644
--- a/src/library/scala/collection/immutable/Map.scala
+++ b/src/library/scala/collection/immutable/Map.scala
@@ -39,12 +39,6 @@ trait Map[A, +B] extends Iterable[(A, B)]
*/
override def updated [B1 >: B](key: A, value: B1): Map[A, B1]
def + [B1 >: B](kv: (A, B1)): Map[A, B1]
-
- /** The same map with a given default function !!! todo: move to general maps? */
- def withDefault[B1 >: B](d: A => B1): Map[A, B1] = new Map.WithDefault[A, B1](this, d)
-
- /** The same map with a given default value */
- def withDefaultValue[B1 >: B](d: B1): Map[A, B1] = new Map.WithDefault[A, B1](this, x => d)
}
/** $factoryInfo
@@ -58,17 +52,6 @@ object Map extends ImmutableMapFactory[Map] {
def empty[A, B]: Map[A, B] = EmptyMap.asInstanceOf[Map[A, B]]
- class WithDefault[A, +B](underlying: Map[A, B], d: A => B) extends Map[A, B] {
- override def size = underlying.size
- def get(key: A) = underlying.get(key) orElse Some(default(key))
- def iterator = underlying.iterator
- override def empty = new WithDefault(underlying.empty, d)
- override def updated[B1 >: B](key: A, value: B1): WithDefault[A, B1] = new WithDefault[A, B1](underlying.updated[B1](key, value), d)
- def + [B1 >: B](kv: (A, B1)): WithDefault[A, B1] = updated(kv._1, kv._2)
- def - (key: A): WithDefault[A, B] = new WithDefault(underlying - key, d)
- override def default(key: A): B = d(key)
- }
-
@serializable
private object EmptyMap extends Map[Any, Nothing] {
override def size: Int = 0
diff --git a/src/library/scala/collection/mutable/Map.scala b/src/library/scala/collection/mutable/Map.scala
index 287069d04b..7a56862119 100644
--- a/src/library/scala/collection/mutable/Map.scala
+++ b/src/library/scala/collection/mutable/Map.scala
@@ -26,6 +26,12 @@ trait Map[A, B]
override def empty: Map[A, B] = Map.empty
+ /** The same map with a given default function !!! todo: move to general maps? */
+ def withDefault(d: A => B): Map[A, B] = new Map.WithDefault[A, B](this, d)
+
+ /** The same map with a given default value */
+ def withDefaultValue(d: B): Map[A, B] = new Map.WithDefault[A, B](this, x => d)
+
/** Return a read-only projection of this map. !!! or just use an (immutable) MapProxy?
def readOnly : scala.collection.Map[A, B] = new scala.collection.Map[A, B] {
override def size = self.size
@@ -49,5 +55,15 @@ object Map extends MutableMapFactory[Map] {
implicit def canBuildFrom[A, B]: CanBuildFrom[Coll, (A, B), Map[A, B]] = new MapCanBuildFrom[A, B]
def empty[A, B]: Map[A, B] = new HashMap[A, B]
+
+ class WithDefault[A, B](underlying: Map[A, B], d: A => B) extends collection.Map.WithDefault(underlying, d) with Map[A, B] {
+ override def += (kv: (A, B)) = {underlying += kv; this}
+ def -= (key: A) = {underlying -= key; this}
+ override def empty = new WithDefault(underlying.empty, d)
+ override def updated[B1 >: B](key: A, value: B1): WithDefault[A, B1] = new WithDefault[A, B1](underlying.updated[B1](key, value), d)
+ override def + [B1 >: B](kv: (A, B1)): WithDefault[A, B1] = updated(kv._1, kv._2)
+ override def - (key: A): WithDefault[A, B] = new WithDefault(underlying - key, d)
+ }
+
}