diff options
-rw-r--r-- | src/dotty/tools/dotc/util/SimpleMap.scala | 48 |
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 } } } |