diff options
author | Adriaan Moors <adriaan.moors@epfl.ch> | 2009-11-03 10:37:56 +0000 |
---|---|---|
committer | Adriaan Moors <adriaan.moors@epfl.ch> | 2009-11-03 10:37:56 +0000 |
commit | 094ed77bd98bbdd22fa8fee4a3e5c3dc0118dc2b (patch) | |
tree | daada3340bcd5735713fc68cc3648107f7f8646e | |
parent | 3d115bd2a4191c28e6d8a9c2633740288479cec7 (diff) | |
download | scala-094ed77bd98bbdd22fa8fee4a3e5c3dc0118dc2b.tar.gz scala-094ed77bd98bbdd22fa8fee4a3e5c3dc0118dc2b.tar.bz2 scala-094ed77bd98bbdd22fa8fee4a3e5c3dc0118dc2b.zip |
fixed #2500: refactoring collections so that a ...
fixed #2500: refactoring collections so that a `collection.{Map|SortedMap|SortedSet}` can be built from the corresponding collection (thus, do not require the immutable one)
pulling up newBuilder method from Immutable*Factory to *Factory, and
inheriting *Factory in scala.collection companion objects, instead of
the Immutable*Factory this way, you can, e.g., build a collection.Map
from a collection.Map (instead of requiring an immutable.Map)
10 files changed, 28 insertions, 36 deletions
diff --git a/src/library/scala/collection/Map.scala b/src/library/scala/collection/Map.scala index b53786308b..f947e4e5da 100644 --- a/src/library/scala/collection/Map.scala +++ b/src/library/scala/collection/Map.scala @@ -35,7 +35,7 @@ import generic._ * @note If you do not have specific implementations for `add` and `-` in mind, * you might consider inheriting from <code>DefaultMap</code> instead. * - * @note Of you additions and mutations return the same kind of map as the map + * @note If your additions and mutations return the same kind of map as the map * you are defining, you should inherit from <code>MapLike</code> as well. * * @since 1 @@ -48,7 +48,8 @@ trait Map[A, +B] extends Iterable[(A, B)] with MapLike[A, B, Map[A, B]] { * * @since 2.5 */ -object Map extends ImmutableMapFactory[immutable.Map] { - def empty[A, B]: immutable.Map[A, B] = immutable.Map.empty +object Map extends MapFactory[Map] { + def empty[A, B]: Map[A, B] = immutable.Map.empty + implicit def canBuildFrom[A, B]: CanBuildFrom[Coll, (A, B), Map[A, B]] = new MapCanBuildFrom[A, B] } diff --git a/src/library/scala/collection/SortedMap.scala b/src/library/scala/collection/SortedMap.scala index 8846e47bc3..611f6ed013 100644 --- a/src/library/scala/collection/SortedMap.scala +++ b/src/library/scala/collection/SortedMap.scala @@ -30,9 +30,10 @@ trait SortedMap[A, +B] extends Map[A, B] with SortedMapLike[A, B, SortedMap[A, B /** * @since 2.8 */ -object SortedMap extends ImmutableSortedMapFactory[immutable.SortedMap] { +object SortedMap extends SortedMapFactory[SortedMap] { + def empty[A, B](implicit ord: Ordering[A]): SortedMap[A, B] = immutable.SortedMap.empty[A, B](ord) + implicit def canBuildFrom[A, B](implicit ord: Ordering[A]): CanBuildFrom[Coll, (A, B), SortedMap[A, B]] = new SortedMapCanBuildFrom[A, B] - def empty[A, B](implicit ord: Ordering[A]): immutable.SortedMap[A, B] = immutable.SortedMap.empty[A, B](ord) } diff --git a/src/library/scala/collection/SortedSet.scala b/src/library/scala/collection/SortedSet.scala index eebfd44e44..ab988e39ad 100644 --- a/src/library/scala/collection/SortedSet.scala +++ b/src/library/scala/collection/SortedSet.scala @@ -26,9 +26,9 @@ trait SortedSet[A] extends Set[A] with SortedSetLike[A, SortedSet[A]] { /** * @since 2.8 */ -object SortedSet extends ImmutableSortedSetFactory[immutable.SortedSet] { +object SortedSet extends SortedSetFactory[SortedSet] { + def empty[A](implicit ord: Ordering[A]): SortedSet[A] = immutable.SortedSet.empty[A](ord) implicit def canBuildFrom[A](implicit ord: Ordering[A]): CanBuildFrom[Coll, A, SortedSet[A]] = new SortedSetCanBuildFrom[A] - def empty[A](implicit ord: Ordering[A]): immutable.SortedSet[A] = immutable.SortedSet.empty[A](ord) } diff --git a/src/library/scala/collection/generic/ImmutableMapFactory.scala b/src/library/scala/collection/generic/ImmutableMapFactory.scala index 88862d3b4e..53d831dbfb 100644 --- a/src/library/scala/collection/generic/ImmutableMapFactory.scala +++ b/src/library/scala/collection/generic/ImmutableMapFactory.scala @@ -11,15 +11,9 @@ package scala.collection package generic -import mutable.{Builder, MapBuilder} - /** A template for companion objects of <code>immutable.Map</code> and * subclasses thereof. * * @since 2.8 */ -abstract class ImmutableMapFactory[CC[A, +B] <: immutable.Map[A, B] with immutable.MapLike[A, B, CC[A, B]]] - extends MapFactory[CC] { - - def newBuilder[A, B] = new MapBuilder[A, B, CC[A, B]](empty[A, B]) -} +abstract class ImmutableMapFactory[CC[A, +B] <: immutable.Map[A, B] with immutable.MapLike[A, B, CC[A, B]]] extends MapFactory[CC] diff --git a/src/library/scala/collection/generic/ImmutableSortedMapFactory.scala b/src/library/scala/collection/generic/ImmutableSortedMapFactory.scala index 296d166471..6f8ef7d7a3 100644 --- a/src/library/scala/collection/generic/ImmutableSortedMapFactory.scala +++ b/src/library/scala/collection/generic/ImmutableSortedMapFactory.scala @@ -12,15 +12,8 @@ package scala.collection package generic -import mutable.{Builder, MapBuilder} - /** A template for companion objects of immutable.Map and subclasses thereof. * * @since 2.8 */ -abstract class ImmutableSortedMapFactory[CC[A, B] <: immutable.SortedMap[A, B] with SortedMapLike[A, B, CC[A, B]]] - extends SortedMapFactory[CC] { - - def newBuilder[A, B](implicit ord: Ordering[A]): Builder[(A, B), CC[A, B]] = - new MapBuilder[A, B, CC[A, B]](empty(ord)) -} +abstract class ImmutableSortedMapFactory[CC[A, B] <: immutable.SortedMap[A, B] with SortedMapLike[A, B, CC[A, B]]] extends SortedMapFactory[CC] diff --git a/src/library/scala/collection/generic/ImmutableSortedSetFactory.scala b/src/library/scala/collection/generic/ImmutableSortedSetFactory.scala index 84b990314b..e9e7599bca 100644 --- a/src/library/scala/collection/generic/ImmutableSortedSetFactory.scala +++ b/src/library/scala/collection/generic/ImmutableSortedSetFactory.scala @@ -12,12 +12,8 @@ package scala.collection package generic -import mutable.{Builder, SetBuilder} - /** A template for companion objects of mutable.Map and subclasses thereof. * * @since 2.8 */ -abstract class ImmutableSortedSetFactory[CC[A] <: immutable.SortedSet[A] with SortedSetLike[A, CC[A]]] extends SortedSetFactory[CC]{ - def newBuilder[A](implicit ord: Ordering[A]): Builder[A, CC[A]] = new SetBuilder[A, CC[A]](empty) -} +abstract class ImmutableSortedSetFactory[CC[A] <: immutable.SortedSet[A] with SortedSetLike[A, CC[A]]] extends SortedSetFactory[CC]
\ No newline at end of file diff --git a/src/library/scala/collection/generic/MapFactory.scala b/src/library/scala/collection/generic/MapFactory.scala index 9e47412448..2476142ec7 100644 --- a/src/library/scala/collection/generic/MapFactory.scala +++ b/src/library/scala/collection/generic/MapFactory.scala @@ -12,7 +12,7 @@ package scala.collection package generic -import mutable.Builder +import mutable.{Builder, MapBuilder} /** A template for companion objects of <code>mutable.Map</code> and * subclasses thereof. @@ -23,12 +23,12 @@ abstract class MapFactory[CC[A, B] <: Map[A, B] with MapLike[A, B, CC[A, B]]] { type Coll = CC[_, _] - def newBuilder[A, B]: Builder[(A, B), CC[A, B]] - def empty[A, B]: CC[A, B] def apply[A, B](elems: (A, B)*): CC[A, B] = (newBuilder[A, B] ++= elems).result + def newBuilder[A, B]: Builder[(A, B), CC[A, B]] = new MapBuilder[A, B, CC[A, B]](empty[A, B]) + class MapCanBuildFrom[A, B] extends CanBuildFrom[Coll, (A, B), CC[A, B]] { def apply(from: Coll) = newBuilder[A, B] def apply() = newBuilder diff --git a/src/library/scala/collection/generic/SortedMapFactory.scala b/src/library/scala/collection/generic/SortedMapFactory.scala index 5bba735fef..29a92fc471 100644 --- a/src/library/scala/collection/generic/SortedMapFactory.scala +++ b/src/library/scala/collection/generic/SortedMapFactory.scala @@ -12,7 +12,7 @@ package scala.collection package generic -import mutable.Builder +import mutable.{Builder, MapBuilder} /** A template for companion objects of mutable.Map and subclasses thereof. * @@ -22,12 +22,13 @@ abstract class SortedMapFactory[CC[A, B] <: SortedMap[A, B] with SortedMapLike[A type Coll = CC[_, _] - def newBuilder[A, B](implicit ord: Ordering[A]): Builder[(A, B), CC[A, B]] - def empty[A, B](implicit ord: Ordering[A]): CC[A, B] def apply[A, B](elems: (A, B)*)(implicit ord: Ordering[A]): CC[A, B] = (newBuilder[A, B](ord) ++= elems).result + def newBuilder[A, B](implicit ord: Ordering[A]): Builder[(A, B), CC[A, B]] = + new MapBuilder[A, B, CC[A, B]](empty(ord)) + class SortedMapCanBuildFrom[A, B](implicit ord: Ordering[A]) extends CanBuildFrom[Coll, (A, B), CC[A, B]] { def apply(from: Coll) = newBuilder[A, B](ord) def apply() = newBuilder[A, B] diff --git a/src/library/scala/collection/generic/SortedSetFactory.scala b/src/library/scala/collection/generic/SortedSetFactory.scala index 1c7ca885aa..b4d507cfe0 100644 --- a/src/library/scala/collection/generic/SortedSetFactory.scala +++ b/src/library/scala/collection/generic/SortedSetFactory.scala @@ -12,7 +12,7 @@ package scala.collection package generic -import mutable.Builder +import mutable.{Builder, SetBuilder} /** A template for companion objects of Set and subclasses thereof. * @@ -21,12 +21,12 @@ import mutable.Builder abstract class SortedSetFactory[CC[A] <: SortedSet[A] with SortedSetLike[A, CC[A]]] { type Coll = CC[_] - def newBuilder[A](implicit ord: Ordering[A]): Builder[A, CC[A]] - def empty[A](implicit ord: Ordering[A]): CC[A] def apply[A](elems: A*)(implicit ord: Ordering[A]): CC[A] = (newBuilder[A](ord) ++= elems).result + def newBuilder[A](implicit ord: Ordering[A]): Builder[A, CC[A]] = new SetBuilder[A, CC[A]](empty) + implicit def newCanBuildFrom[A](implicit ord : Ordering[A]) : CanBuildFrom[Coll, A, CC[A]] = new SortedSetCanBuildFrom()(ord); class SortedSetCanBuildFrom[A](implicit ord: Ordering[A]) extends CanBuildFrom[Coll, A, CC[A]] { diff --git a/test/files/pos/t2500.scala b/test/files/pos/t2500.scala new file mode 100644 index 0000000000..76dea4cf8d --- /dev/null +++ b/test/files/pos/t2500.scala @@ -0,0 +1,6 @@ +object Test { + import scala.collection._ + ((Map(1 -> "a", 2 -> "b"): collection.Map[Int, String]) map identity[(Int, String)]) : scala.collection.Map[Int,String] + ((SortedMap(1 -> "a", 2 -> "b"): collection.SortedMap[Int, String]) map identity[(Int, String)]): scala.collection.SortedMap[Int,String] + ((SortedSet(1, 2): collection.SortedSet[Int]) map identity[Int]): scala.collection.SortedSet[Int] +}
\ No newline at end of file |