aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2013-09-05 15:35:05 +0200
committerMartin Odersky <odersky@gmail.com>2013-09-05 15:35:05 +0200
commiteeffffdb4285e26cd7dd01124a3d94664266a168 (patch)
tree2d3b32d4cf382b4e1c3aefc6d6d64509ae1dff5d
parent15b9f3d6de17c866a1534f62c74d3d08ff5c7bf3 (diff)
downloaddotty-eeffffdb4285e26cd7dd01124a3d94664266a168.tar.gz
dotty-eeffffdb4285e26cd7dd01124a3d94664266a168.tar.bz2
dotty-eeffffdb4285e26cd7dd01124a3d94664266a168.zip
Made SimpleMap non-variant in key type and added map2 method.
Better type for foreachKey that way.
-rw-r--r--src/dotty/tools/dotc/util/SimpleMap.scala48
1 files changed, 32 insertions, 16 deletions
diff --git a/src/dotty/tools/dotc/util/SimpleMap.scala b/src/dotty/tools/dotc/util/SimpleMap.scala
index 3acc5c4b8..f4f238c5e 100644
--- a/src/dotty/tools/dotc/util/SimpleMap.scala
+++ b/src/dotty/tools/dotc/util/SimpleMap.scala
@@ -1,17 +1,31 @@
package dotty.tools.dotc.util
-abstract class SimpleMap[-K, +V >: Null] {
+import collection.mutable.ListBuffer
+
+abstract class SimpleMap[K, +V >: Null] {
def apply(k: K): V
def remove(k: K): SimpleMap[K, V]
def updated[V1 >: V](k: K, v: V1): SimpleMap[K, V1]
def contains(k: K): Boolean = apply(k) != null
def mapValues[V1 >: V](f: V1 => V1): SimpleMap[K, V1]
- def foreachKey(f: Any => Unit): Unit
+ def foreachKey(f: K => Unit): Unit
+ def map2[T](f: (K, V) => T): List[T] = {
+ val buf = new ListBuffer[T]
+ foreachKey { key =>
+ val k = key.asInstanceOf[K]
+ buf += f(k, this(k))
+ }
+ buf.toList
+ }
+ override def toString = {
+ def assocToString(key: K, value: V) = s"$key -> $value"
+ map2(assocToString) mkString ("(", ", ", ")")
+ }
}
object SimpleMap {
- object Empty extends SimpleMap[Any, Null] {
+ private object myEmpty extends SimpleMap[Any, Null] {
def apply(k: Any) = null
def remove(k: Any) = this
def updated[V1 >: Null](k: Any, v: V1) = new Map1(k, v)
@@ -19,22 +33,24 @@ object SimpleMap {
def foreachKey(f: Any => Unit) = ()
}
- class Map1[-K, +V >: Null] (k1: K, v1: V) extends SimpleMap[K, V] {
+ def Empty[K] = myEmpty.asInstanceOf[SimpleMap[K, Null]]
+
+ class Map1[K, +V >: Null] (k1: K, v1: V) extends SimpleMap[K, V] {
def apply(k: K) =
if (k == k1) v1
else null
def remove(k: K) =
- if (k == k1) Empty
+ if (k == k1) Empty.asInstanceOf[SimpleMap[K, V]]
else this
def updated[V1 >: V](k: K, v: V1) =
if (k == k1) new Map1(k, v)
else new Map2(k1, v1, k, v)
def mapValues[V1 >: V](f: V1 => V1) =
new Map1(k1, f(v1))
- def foreachKey(f: Any => Unit) = f(k1)
+ def foreachKey(f: K => Unit) = f(k1)
}
- class Map2[-K, +V >: Null] (k1: K, v1: V, k2: K, v2: V) extends SimpleMap[K, V] {
+ class Map2[K, +V >: Null] (k1: K, v1: V, k2: K, v2: V) extends SimpleMap[K, V] {
def apply(k: K) =
if (k == k1) v1
else if (k == k2) v2
@@ -49,10 +65,10 @@ object SimpleMap {
else new Map3(k1, v1, k2, v2, k, v)
def mapValues[V1 >: V](f: V1 => V1) =
new Map2(k1, f(v1), k2, f(v2))
- def foreachKey(f: Any => Unit) = { f(k1); f(k2) }
+ def foreachKey(f: K => Unit) = { f(k1); f(k2) }
}
- class Map3[-K, +V >: Null] (k1: K, v1: V, k2: K, v2: V, k3: K, v3: V) extends SimpleMap[K, V] {
+ class Map3[K, +V >: Null] (k1: K, v1: V, k2: K, v2: V, k3: K, v3: V) extends SimpleMap[K, V] {
def apply(k: K) =
if (k == k1) v1
else if (k == k2) v2
@@ -70,10 +86,10 @@ object SimpleMap {
else new Map4(k1, v1, k2, v2, k3, v3, k, v)
def mapValues[V1 >: V](f: V1 => V1) =
new Map3(k1, f(v1), k2, f(v2), k3, f(v3))
- def foreachKey(f: Any => Unit) = { f(k1); f(k2); f(k3) }
+ def foreachKey(f: K => Unit) = { f(k1); f(k2); f(k3) }
}
- class Map4[-K, +V >: Null] (k1: K, v1: V, k2: K, v2: V, k3: K, v3: V, k4: K, v4: V) extends SimpleMap[K, V] {
+ class Map4[K, +V >: Null] (k1: K, v1: V, k2: K, v2: V, k3: K, v3: V, k4: K, v4: V) extends SimpleMap[K, V] {
def apply(k: K) =
if (k == k1) v1
else if (k == k2) v2
@@ -94,10 +110,10 @@ object SimpleMap {
else new Map5(k1, v1, k2, v2, k3, v3, k4, v4, k, v)
def mapValues[V1 >: V](f: V1 => V1) =
new Map4(k1, f(v1), k2, f(v2), k3, f(v3), k4, f(v4))
- def foreachKey(f: Any => Unit) = { f(k1); f(k2); f(k3); f(k4) }
+ def foreachKey(f: K => Unit) = { f(k1); f(k2); f(k3); f(k4) }
}
- class Map5[-K, +V >: Null] (k1: K, v1: V, k2: K, v2: V, k3: K, v3: V, k4: K, v4: V, k5: K, v5: V) extends SimpleMap[K, V] {
+ class Map5[K, +V >: Null] (k1: K, v1: V, k2: K, v2: V, k3: K, v3: V, k4: K, v4: V, k5: K, v5: V) extends SimpleMap[K, V] {
def apply(k: K) =
if (k == k1) v1
else if (k == k2) v2
@@ -121,10 +137,10 @@ object SimpleMap {
else new MapMore(Map(k1 -> v1, k2 -> v2, k3 -> v3, k4 -> v4, k5 -> v5, k -> v))
def mapValues[V1 >: V](f: V1 => V1) =
new Map5(k1, f(v1), k2, f(v2), k3, f(v3), k4, f(v4), k5, f(v5))
- def foreachKey(f: Any => Unit) = { f(k1); f(k2); f(k3); f(k4); f(k5) }
+ def foreachKey(f: K => Unit) = { f(k1); f(k2); f(k3); f(k4); f(k5) }
}
- class MapMore[-K, +V >: Null] (m: Map[K, V]) extends SimpleMap[K, V] {
+ class MapMore[K, +V >: Null] (m: Map[K, V]) extends SimpleMap[K, V] {
def apply(k: K) = m get k match {
case Some(v) => v
case None => null
@@ -142,6 +158,6 @@ object SimpleMap {
override def contains(k: K) = m contains k
def mapValues[V1 >: V](f: V1 => V1) =
new MapMore(m mapValues f)
- def foreachKey(f: Any => Unit) = { m.keysIterator foreach f }
+ def foreachKey(f: K => Unit) = { m.keysIterator foreach f }
}
}