Skip to content

Commit 8a29b41

Browse files
committed
squash! Fix implementation of filterKeys
add implicit cbf for chaining
1 parent a1cc269 commit 8a29b41

File tree

4 files changed

+28
-6
lines changed

4 files changed

+28
-6
lines changed

compat/src/main/scala-2.11/scala/collection/compat/package.scala

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,22 @@
1212

1313
package scala.collection
1414

15-
import scala.collection.generic.IsTraversableLike
15+
import scala.collection.generic.{CanBuildFrom, IsTraversableLike}
1616

1717
package object compat extends compat.PackageShared {
1818
implicit def toTraversableLikeExtensionMethods[Repr](self: Repr)(
1919
implicit traversable: IsTraversableLike[Repr])
2020
: TraversableLikeExtensionMethods[traversable.A, Repr] =
2121
new TraversableLikeExtensionMethods[traversable.A, Repr](traversable.conversion(self))
22+
23+
// CanBuildFrom instances for `IterableView[(K, V), Map[K, V]]` that preserve
24+
// the strict type of the view to be `Map` instead of `Iterable`
25+
// Instances produced by this method are used to chain `filterKeys` after `mapValues`
26+
implicit def canBuildFromIterableViewMapLike[K, V, L, W, CC[X, Y] <: Map[X, Y]]: CanBuildFrom[IterableView[(K, V), CC[K, V]], (L, W), IterableView[(L, W), CC[L, W]]] =
27+
new CanBuildFrom[IterableView[(K, V), CC[K, V]], (L, W), IterableView[(L, W), CC[L, W]]] {
28+
// `CanBuildFrom` parameters are used as type constraints, they are not used
29+
// at run-time, hence the dummy builder implementations
30+
def apply(from: IterableView[(K, V), CC[K, V]]) = new TraversableView.NoBuilder
31+
def apply() = new TraversableView.NoBuilder
32+
}
2233
}

compat/src/main/scala-2.11_2.12/scala/collection/compat/PackageShared.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -284,8 +284,9 @@ class MapViewExtensionMethods[K, V, C <: scala.collection.Map[K, V]](
284284
implicit bf: CanBuildFrom[IterableView[(K, V), C], (K, W), That]): That =
285285
self.map[(K, W), That] { case (k, v) => (k, f(v)) }
286286

287-
// TODO: replace the current implementation of `mapValues` with this
288-
// after major version bump when bincompat can be broken
287+
// TODO: Replace the current implementation of `mapValues` with this
288+
// after major version bump when bincompat can be broken.
289+
// At the same time, remove `canBuildFromIterableViewMapLike`
289290
/*
290291
def mapValues[W](f: V => W): IterableView[(K, W), C] =
291292
// the implementation of `self.map` also casts the result

compat/src/main/scala-2.12/scala/collection/compat/package.scala

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
package scala.collection
1414

15-
import scala.collection.generic.IsTraversableLike
15+
import scala.collection.generic.{CanBuildFrom, IsTraversableLike}
1616
import scala.collection.{mutable => m}
1717

1818
package object compat extends compat.PackageShared {
@@ -30,4 +30,15 @@ package object compat extends compat.PackageShared {
3030
implicit traversable: IsTraversableLike[Repr])
3131
: TraversableLikeExtensionMethods[traversable.A, Repr] =
3232
new TraversableLikeExtensionMethods[traversable.A, Repr](traversable.conversion(self))
33+
34+
// CanBuildFrom instances for `IterableView[(K, V), Map[K, V]]` that preserve
35+
// the strict type of the view to be `Map` instead of `Iterable`
36+
// Instances produced by this method are used to chain `filterKeys` after `mapValues`
37+
implicit def canBuildFromIterableViewMapLike[K, V, L, W, CC[X, Y] <: Map[X, Y]]: CanBuildFrom[IterableView[(K, V), CC[K, V]], (L, W), IterableView[(L, W), CC[L, W]]] =
38+
new CanBuildFrom[IterableView[(K, V), CC[K, V]], (L, W), IterableView[(L, W), CC[L, W]]] {
39+
// `CanBuildFrom` parameters are used as type constraints, they are not used
40+
// at run-time, hence the dummy builder implementations
41+
def apply(from: IterableView[(K, V), CC[K, V]]) = new TraversableView.NoBuilder
42+
def apply() = new TraversableView.NoBuilder
43+
}
3344
}

compat/src/test/scala/test/scala/collection/ViewTest.scala

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,7 @@ class ViewTest {
3939
def filterKeysMapValues(): Unit = {
4040
val m = Map("a" -> 1, "b" -> 2, "c" -> 3)
4141
assertEquals(Map(), m.view.filterKeys(_.length > 1).mapValues(_ + 1).toMap)
42-
// TODO: uncomment after major version bump when `mapValues` can be fixed
43-
//assertEquals(Map(), m.view.mapValues(_ + 1).filterKeys(_.length > 1).toMap)
42+
assertEquals(Map(), m.view.mapValues(_ + 1).filterKeys(_.length > 1).toMap)
4443
}
4544

4645
}

0 commit comments

Comments
 (0)