Skip to content

Commit 71404ad

Browse files
committed
fixup! #11 Add groupMap and groupMapReduce extensions
simplify impl and tweak test
1 parent 8bb19fb commit 71404ad

File tree

2 files changed

+22
-26
lines changed

2 files changed

+22
-26
lines changed

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

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -253,34 +253,30 @@ class TraversableExtensionMethods[A](private val self: c.Traversable[A]) extends
253253
class TraversableLikeExtensionMethods[A, Repr](private val self: c.GenTraversableLike[A, Repr])
254254
extends AnyVal {
255255

256-
def groupMap[K, B, VThat, That](key: A => K)(f: A => B)(
257-
implicit traversable: IsTraversableLikeAux[A, Repr],
258-
innerBf: CanBuildFrom[Repr, B, VThat],
259-
outerBf: CanBuildFrom[c.GenMap[K, Repr], (K, VThat), That]): That = {
260-
val grouped = self.groupBy(key)
261-
val outerB = outerBf(grouped)
262-
for ((k, repr) <- grouped.toIterator) {
263-
val innerB = innerBf(repr)
264-
for (a <- traversable.conversion(repr)) innerB += f(a)
265-
outerB.+=((k, innerB.result()))
256+
def groupMap[K, B, That](key: A => K)(f: A => B)(
257+
implicit bf: CanBuildFrom[Repr, B, That]): Map[K, That] = {
258+
val map = m.Map.empty[K, m.Builder[B, That]]
259+
for (elem <- self) {
260+
val k = key(elem)
261+
val bldr = map.getOrElseUpdate(k, bf(self.repr))
262+
bldr += f(elem)
266263
}
267-
outerB.result()
264+
val res = Map.newBuilder[K, That]
265+
for ((k, bldr) <- map) res += ((k, bldr.result()))
266+
res.result()
268267
}
269268

270-
def groupMapReduce[K, B, That](key: A => K)(f: A => B)(reduce: (B, B) => B)(
271-
implicit traversable: IsTraversableLikeAux[A, Repr],
272-
bf: CanBuildFrom[c.GenMap[K, Repr], (K, B), That]): That = {
273-
val grouped = self.groupBy(key)
274-
val b = bf(grouped)
275-
for ((k, repr) <- grouped.toIterator) {
276-
val elem = traversable
277-
.conversion(repr)
278-
.toIterator
279-
.map(f)
280-
.reduce(reduce)
281-
b.+=((k, elem))
269+
def groupMapReduce[K, B](key: A => K)(f: A => B)(reduce: (B, B) => B): Map[K, B] = {
270+
val map = m.Map.empty[K, B]
271+
for (elem <- self) {
272+
val k = key(elem)
273+
val v = map.get(k) match {
274+
case Some(b) => reduce(b, f(elem))
275+
case None => f(elem)
276+
}
277+
map.put(k, v)
282278
}
283-
b.result()
279+
map.toMap
284280
}
285281
}
286282

compat/src/test/scala/test/scala/collection/TraversableLikeTest.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class TraversableLikeTest {
2929
@Test
3030
def groupMapReduce(): Unit = {
3131
val res = Seq("foo", "test", "bar", "baz")
32-
.groupMapReduce(_.length)(_.toUpperCase())(_ + _)
33-
assertEquals(Map(3 -> "FOOBARBAZ", 4 -> "TEST"), res)
32+
.groupMapReduce(_.length)(_ => 1)(_ + _)
33+
assertEquals(Map(3 -> 3, 4 -> 1), res)
3434
}
3535
}

0 commit comments

Comments
 (0)