Skip to content

Commit 30deafd

Browse files
committed
[bug#12059] Make MapView#values and #keys return Views
Change`MapView#values` and `MapView#keys` to return `View`s instead of `AbstractIterable`s, so that further operations on the returned values remain lazy.
1 parent 9a3deb5 commit 30deafd

File tree

1 file changed

+30
-0
lines changed

1 file changed

+30
-0
lines changed

library/src/scala/collection/MapView.scala

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,20 @@ trait MapView[K, +V]
2121

2222
override def view: MapView[K, V] = this
2323

24+
// Ideally this returns a `View`, but bincompat
25+
/** Creates a view over all keys of this map.
26+
*
27+
* @return the keys of this map as a view.
28+
*/
29+
override def keys: Iterable[K] = new MapView.Keys(this)
30+
31+
// Ideally this returns a `View`, but bincompat
32+
/** Creates a view over all values of this map.
33+
*
34+
* @return the values of this map as a view.
35+
*/
36+
override def values: Iterable[V] = new MapView.Values(this)
37+
2438
/** Filters this map by retaining only keys satisfying a predicate.
2539
* @param p the predicate used to test keys
2640
* @return an immutable map consisting only of those key value pairs of this map where the key satisfies
@@ -82,6 +96,22 @@ object MapView extends MapViewFactory {
8296
override def isEmpty: Boolean = underlying.isEmpty
8397
}
8498

99+
// Ideally this is public, but bincompat
100+
@SerialVersionUID(3L)
101+
private class Keys[K](underlying: SomeMapOps[K, _]) extends AbstractView[K] {
102+
def iterator: Iterator[K] = underlying.keysIterator
103+
override def knownSize: Int = underlying.knownSize
104+
override def isEmpty: Boolean = underlying.isEmpty
105+
}
106+
107+
// Ideally this is public, but bincompat
108+
@SerialVersionUID(3L)
109+
private class Values[+V](underlying: SomeMapOps[_, V]) extends AbstractView[V] {
110+
def iterator: Iterator[V] = underlying.valuesIterator
111+
override def knownSize: Int = underlying.knownSize
112+
override def isEmpty: Boolean = underlying.isEmpty
113+
}
114+
85115
@SerialVersionUID(3L)
86116
class MapValues[K, +V, +W](underlying: SomeMapOps[K, V], f: V => W) extends AbstractMapView[K, W] {
87117
def iterator: Iterator[(K, W)] = underlying.iterator.map(kv => (kv._1, f(kv._2)))

0 commit comments

Comments
 (0)