@@ -30,6 +30,8 @@ private[compat] trait PackageShared {
30
30
*/
31
31
type Factory [- A , + C ] = CanBuildFrom [Nothing , A , C ]
32
32
33
+ type IsTraversableLikeAux [A1 , Repr ] = IsTraversableLike [Repr ] { type A = A1 }
34
+
33
35
implicit class FactoryOps [- A , + C ](private val factory : Factory [A , C ]) {
34
36
35
37
/**
@@ -154,6 +156,11 @@ private[compat] trait PackageShared {
154
156
self : Traversable [A ]): TraversableExtensionMethods [A ] =
155
157
new TraversableExtensionMethods [A ](self)
156
158
159
+ implicit def toTraversableLikeExtensionMethods [Repr ](self : Repr )(
160
+ implicit traversable : IsTraversableLike [Repr ])
161
+ : TraversableLikeExtensionMethods [traversable.A , Repr ] =
162
+ new TraversableLikeExtensionMethods [traversable.A , Repr ](traversable.conversion(self))
163
+
157
164
implicit def toTraversableOnceExtensionMethods [A ](
158
165
self : TraversableOnce [A ]): TraversableOnceExtensionMethods [A ] =
159
166
new TraversableOnceExtensionMethods [A ](self)
@@ -243,6 +250,40 @@ class TraversableExtensionMethods[A](private val self: c.Traversable[A]) extends
243
250
def iterableFactory : GenericCompanion [Traversable ] = self.companion
244
251
}
245
252
253
+ class TraversableLikeExtensionMethods [A , Repr ](private val self : c.GenTraversableLike [A , Repr ])
254
+ extends AnyVal {
255
+
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()))
266
+ }
267
+ outerB.result()
268
+ }
269
+
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))
282
+ }
283
+ b.result()
284
+ }
285
+ }
286
+
246
287
class MapViewExtensionMethods [K , V , C <: scala.collection.Map [K , V ]](
247
288
private val self : IterableView [(K , V ), C ])
248
289
extends AnyVal {
0 commit comments