diff options
author | Aleksandar Pokopec <aleksandar.prokopec@epfl.ch> | 2010-09-27 09:38:01 +0000 |
---|---|---|
committer | Aleksandar Pokopec <aleksandar.prokopec@epfl.ch> | 2010-09-27 09:38:01 +0000 |
commit | dace259b47121450b1b5156587dd5d3c9193c82a (patch) | |
tree | 9fd0bf9360ed83791f94679ea1bbfce1d8847d13 /src/library | |
parent | 24a9ae5a42936afc665a9059adb37f38b59b87e5 (diff) | |
download | scala-dace259b47121450b1b5156587dd5d3c9193c82a.tar.gz scala-dace259b47121450b1b5156587dd5d3c9193c82a.tar.bz2 scala-dace259b47121450b1b5156587dd5d3c9193c82a.zip |
Fixes #3829. Review by extempore.
Diffstat (limited to 'src/library')
-rw-r--r-- | src/library/scala/collection/Map.scala | 18 | ||||
-rw-r--r-- | src/library/scala/collection/immutable/Map.scala | 17 | ||||
-rw-r--r-- | src/library/scala/collection/mutable/Map.scala | 16 |
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) + } + } |