Skip to content

Commit 5bfe51a

Browse files
committed
Add buildable for java.util.HashMap
1 parent 256d467 commit 5bfe51a

File tree

4 files changed

+55
-3
lines changed

4 files changed

+55
-3
lines changed

core/shared/src/main/scala-2.12-/org/scalacheck/util/BuildableVersionSpecific.scala

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,19 @@
99

1010
package org.scalacheck.util
1111

12-
import java.util.ArrayList
12+
import java.util.{ArrayList, HashMap}
1313

1414
import collection.{Map => _, _}
1515
import generic.CanBuildFrom
1616
import scala.collection.mutable.Builder
1717

1818
private[util] trait BuildableVersionSpecific {
19+
import scala.collection.JavaConverters._
20+
import scala.language.implicitConversions
21+
22+
implicit def wrapArrayList[T](xs: ArrayList[T]): Traversable[T] = xs.asScala
23+
implicit def wrapHashMap[K, V](xs: HashMap[K, V]): Traversable[(K, V)] = xs.asScala
24+
1925
implicit def buildableCanBuildFrom[T, F, C](implicit c: CanBuildFrom[F, T, C]): Buildable[T, C] =
2026
new Buildable[T, C] {
2127
def builder = c.apply
@@ -32,6 +38,18 @@ private[util] class ArrayListBuilder[T] extends Builder[T, ArrayList[T]] {
3238
def result(): ArrayList[T] = al
3339
}
3440

41+
private[util] class HashMapBuilder[K, V] extends Builder[(K, V), HashMap[K, V]] {
42+
private val hm = new HashMap[K, V]
43+
44+
def +=(x: (K, V)): this.type = {
45+
val (k, v) = x
46+
hm.put(k, v)
47+
this
48+
}
49+
def clear(): Unit = hm.clear()
50+
def result(): HashMap[K, V] = hm
51+
}
52+
3553
/** CanBuildFrom instances implementing Serializable, so that the objects capturing those can be serializable too.
3654
*/
3755
object SerializableCanBuildFroms {

core/shared/src/main/scala-2.13+/org/scalacheck/util/BuildableVersionSpecific.scala

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,16 @@
99

1010
package org.scalacheck.util
1111

12-
import java.util.ArrayList
12+
import java.util.{ArrayList, HashMap}
1313
import scala.collection.mutable.Builder
1414
import scala.collection.{Map => _, _}
1515

1616
private[util] trait BuildableVersionSpecific {
17+
import scala.jdk.CollectionConverters._
18+
19+
implicit def wrapArrayList[T](xs: ArrayList[T]): Iterable[T] = xs.asScala
20+
implicit def wrapHashMap[K, V](xs: HashMap[K, V]): Iterable[(K, V)] = xs.asScala
21+
1722
implicit def buildableFactory[T, C](implicit f: Factory[T, C]): Buildable[T, C] =
1823
new Buildable[T, C] {
1924
def builder = f.newBuilder
@@ -30,6 +35,17 @@ private[util] class ArrayListBuilder[T] extends Builder[T, ArrayList[T]] {
3035
def result(): ArrayList[T] = al
3136
}
3237

38+
private[util] class HashMapBuilder[K, V] extends Builder[(K, V), HashMap[K, V]] {
39+
private val hm = new HashMap[K, V]
40+
def addOne(x: (K, V)): this.type = {
41+
val (k, v) = x
42+
hm.put(k, v)
43+
this
44+
}
45+
def clear(): Unit = hm.clear()
46+
def result(): HashMap[K, V] = hm
47+
}
48+
3349
/** Factory instances implementing Serializable, so that the objects capturing those can be serializable too.
3450
*/
3551
// Named `...CanBuildFroms` for 2.12 source compatibility (`import SerializableCanBuildFroms._`)

core/shared/src/main/scala/org/scalacheck/util/Buildable.scala

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,18 @@ trait Buildable[T, C] extends Serializable {
2222
}
2323

2424
object Buildable extends BuildableVersionSpecific {
25-
import java.util.ArrayList
25+
import java.util.{ArrayList, HashMap}
26+
2627
implicit def buildableArrayList[T]: Buildable[T, ArrayList[T]] =
2728
new Buildable[T, ArrayList[T]] {
2829
def builder = new ArrayListBuilder[T]
2930
}
3031

32+
implicit def buildableHashMap[K, V]: Buildable[(K, V), HashMap[K, V]] =
33+
new Buildable[(K, V), HashMap[K, V]] {
34+
def builder = new HashMapBuilder[K, V]
35+
}
36+
3137
def buildableSeq[T]: Buildable[T, Seq[T]] =
3238
new Buildable[T, Seq[T]] {
3339
def builder: mutable.Builder[T, Seq[T]] =

core/shared/src/test/scala/org/scalacheck/util/BuildableSpecification.scala

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ package util
1212

1313
import scala.collection._
1414

15+
import Buildable._
1516
import ScalaVersionSpecific._
1617

1718
object BuildableSpecification {
@@ -47,4 +48,15 @@ object BuildableSpecification {
4748
implicit val iterableGen: Gen[immutable.Iterable[String]] = container[immutable.Iterable]
4849

4950
implicit val trieIteratorGen: Gen[immutable.Queue[String]] = container[immutable.Queue]
51+
52+
implicit val arrayListGen: Gen[java.util.ArrayList[String]] = container[java.util.ArrayList]
53+
54+
def buildable[C[_, _]](implicit
55+
evb: Buildable[(String, Long), C[String, Long]],
56+
evt: C[String, Long] => Traversable[(String, Long)]
57+
) = Gen.buildableOf[C[String, Long], (String, Long)](for (str <- Gen.alphaStr; lng <- Gen.long) yield (str, lng))
58+
59+
implicit val mapGen: Gen[Map[String, Long]] = buildable[Map]
60+
61+
implicit val hashMapGen: Gen[java.util.HashMap[String, Long]] = buildable[java.util.HashMap]
5062
}

0 commit comments

Comments
 (0)