Skip to content

Commit 719c095

Browse files
derrickburnsclaude
andcommitted
fix: add cross-version parallel collections support via compat package
Implement version-specific compat package objects to handle parallel collections differences between Scala 2.12 and 2.13: - Scala 2.12: Empty compat package (parallel collections built-in) - Scala 2.13: Provide .par extension method via implicit class that delegates to CollectionConverters Also fix .distinct call on ParIterable by converting to Seq first. This enables .par to work across both Scala versions in KMeansPlusPlus. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 84b0431 commit 719c095

File tree

3 files changed

+14
-14
lines changed

3 files changed

+14
-14
lines changed
Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
package com.massivedatascience.clusterer
22

3-
// Scala 2.12: Parallel collections are built-in, no imports needed
4-
package object compat
3+
// Scala 2.12: Parallel collections are built-in, no additional imports needed
4+
// This package object exists for cross-version compatibility
5+
package object compat {
6+
// Empty - parallel collections work out of the box in 2.12
7+
}
Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
package com.massivedatascience.clusterer
22

3-
// Scala 2.13: Re-export CollectionConverters implicits for .par support
4-
package object compat {
5-
implicit def asParIterable[A](iterable: Iterable[A]): scala.collection.parallel.CollectionConverters.IterableIsParallelizable[A] =
6-
scala.collection.parallel.CollectionConverters.IterableIsParallelizable(iterable)
7-
8-
implicit def asParSeq[A](seq: scala.collection.Seq[A]): scala.collection.parallel.CollectionConverters.SeqIsParallelizable[A] =
9-
scala.collection.parallel.CollectionConverters.SeqIsParallelizable(seq)
3+
import scala.language.implicitConversions
104

11-
implicit def asParMap[K, V](map: scala.collection.Map[K, V]): scala.collection.parallel.CollectionConverters.MapIsParallelizable[K, V] =
12-
scala.collection.parallel.CollectionConverters.MapIsParallelizable(map)
5+
// Scala 2.13: Provide .par extension method via compat package
6+
package object compat {
7+
implicit class ParOps[A, CC[X] <: Iterable[X]](private val coll: CC[A]) extends AnyVal {
8+
@inline def par: scala.collection.parallel.ParIterable[A] =
9+
scala.collection.parallel.CollectionConverters.IterableIsParallelizable(coll).par
10+
}
1311
}

src/main/scala/com/massivedatascience/clusterer/KMeansPlusPlus.scala

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@ import com.massivedatascience.util.XORShiftRandom
2525
import scala.annotation.tailrec
2626
import scala.collection.mutable.ArrayBuffer
2727

28-
// Scala 2.13 needs this import for .par; Scala 2.12 will ignore it (built-in)
29-
// The ParCollectionCompat trait brings this into scope
28+
// Cross-version parallel collections support via compat package
3029
import com.massivedatascience.clusterer.compat._
3130

3231
/** This implements the <a href="http://ilpubs.stanford.edu:8090/778/1/2006-13.pdf">KMeans++ initialization
@@ -155,7 +154,7 @@ class KMeansPlusPlus(ops: BregmanPointOps) extends Serializable with Logging {
155154
pickWeighted(rand, cumulative).iterator
156155
}
157156

158-
val uniqueSelected = selected.distinct
157+
val uniqueSelected = selected.seq.toSeq.distinct
159158
logger.debug(
160159
s"Selected ${uniqueSelected.size} unique centers from ${selected.size} samples"
161160
)

0 commit comments

Comments
 (0)