Skip to content

Commit 3d7a37e

Browse files
Split compat package object for 2.11 and 2.12
mutable.TreeMap and mutable.ListMap are not available in 2.11. It's not possible to put implicit classes in a shared trait. We have to duplicate a bit the api
1 parent abaa151 commit 3d7a37e

File tree

4 files changed

+262
-111
lines changed

4 files changed

+262
-111
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package scala.collection
2+
3+
import scala.collection.generic._
4+
import scala.collection.{immutable => i, mutable => m}
5+
6+
package object compat extends compat.PackageShared {
7+
implicit def toImmutableSortedMapExtensions(fact: i.SortedMap.type): compat.ImmutableSortedMapExtensions =
8+
new compat.ImmutableSortedMapExtensions(fact)
9+
10+
implicit def toImmutableListMapExtensions(fact: i.ListMap.type): compat.ImmutableListMapExtensions =
11+
new compat.ImmutableListMapExtensions(fact)
12+
13+
implicit def toImmutableHashMapExtensions(fact: i.HashMap.type): compat.ImmutableHashMapExtensions =
14+
new compat.ImmutableHashMapExtensions(fact)
15+
16+
implicit def toImmutableTreeMapExtensions(fact: i.TreeMap.type): compat.ImmutableTreeMapExtensions =
17+
new compat.ImmutableTreeMapExtensions(fact)
18+
19+
implicit def toImmutableIntMapExtensions(fact: i.IntMap.type): compat.ImmutableIntMapExtensions =
20+
new compat.ImmutableIntMapExtensions(fact)
21+
22+
implicit def toImmutableLongMapExtensions(fact: i.LongMap.type): compat.ImmutableLongMapExtensions =
23+
new compat.ImmutableLongMapExtensions(fact)
24+
25+
implicit def toMutableLongMapExtensions(fact: m.LongMap.type): compat.MutableLongMapExtensions =
26+
new compat.MutableLongMapExtensions(fact)
27+
28+
implicit def toMutableHashMapExtensions(fact: m.HashMap.type): compat.MutableHashMapExtensions =
29+
new compat.MutableHashMapExtensions(fact)
30+
31+
implicit def toMutableListMapExtensions(fact: m.ListMap.type): compat.MutableListMapExtensions =
32+
new compat.MutableListMapExtensions(fact)
33+
34+
implicit def toMutableMapExtensions(fact: m.Map.type): compat.MutableMapExtensions =
35+
new compat.MutableMapExtensions(fact)
36+
37+
implicit def toStreamExtensionMethods[A](stream: Stream[A]): compat.StreamExtensionMethods[A] =
38+
new compat.StreamExtensionMethods[A](stream)
39+
40+
implicit def toSortedExtensionMethods[K, V <: Sorted[K, V]](fact: Sorted[K, V]): compat.SortedExtensionMethods[K, V] =
41+
new compat.SortedExtensionMethods[K, V](fact)
42+
43+
implicit def toIteratorExtensionMethods[A](self: Iterator[A]): compat.IteratorExtensionMethods[A] =
44+
new compat.IteratorExtensionMethods[A](self)
45+
46+
implicit def toTraversableOnceExtensionMethods[A](self: TraversableOnce[A]): compat.TraversableOnceExtensionMethods[A] =
47+
new compat.TraversableOnceExtensionMethods[A](self)
48+
}
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
package scala.collection.compat
2+
3+
import scala.collection.generic._
4+
import scala.reflect.ClassTag
5+
import scala.collection.{MapLike, GenTraversable, BitSet}
6+
import scala.collection.{immutable => i, mutable => m}
7+
import scala.{collection => c}
8+
9+
/** The collection compatibility API */
10+
private[compat] trait PackageShared {
11+
import CompatImpl._
12+
13+
implicit def genericCompanionToCBF[A, CC[X] <: GenTraversable[X]](
14+
fact: GenericCompanion[CC]): CanBuildFrom[Any, A, CC[A]] =
15+
simpleCBF(fact.newBuilder[A])
16+
17+
implicit def sortedSetCompanionToCBF[
18+
A: Ordering,
19+
CC[X] <: c.SortedSet[X] with c.SortedSetLike[X, CC[X]]](
20+
fact: SortedSetFactory[CC]): CanBuildFrom[Any, A, CC[A]] =
21+
simpleCBF(fact.newBuilder[A])
22+
23+
implicit def arrayCompanionToCBF[A: ClassTag](
24+
fact: Array.type): CanBuildFrom[Any, A, Array[A]] =
25+
simpleCBF(Array.newBuilder[A])
26+
27+
implicit def mapFactoryToCBF[
28+
K,
29+
V,
30+
CC[A, B] <: Map[A, B] with MapLike[A, B, CC[A, B]]](
31+
fact: MapFactory[CC]): CanBuildFrom[Any, (K, V), CC[K, V]] =
32+
simpleCBF(fact.newBuilder[K, V])
33+
34+
implicit def sortedMapFactoryToCBF[
35+
K: Ordering,
36+
V,
37+
CC[A, B] <: c.SortedMap[A, B] with c.SortedMapLike[A, B, CC[A, B]]](
38+
fact: SortedMapFactory[CC]): CanBuildFrom[Any, (K, V), CC[K, V]] =
39+
simpleCBF(fact.newBuilder[K, V])
40+
41+
implicit def bitSetFactoryToCBF(
42+
fact: BitSetFactory[BitSet]): CanBuildFrom[Any, Int, BitSet] =
43+
simpleCBF(fact.newBuilder)
44+
45+
implicit def immutableBitSetFactoryToCBF(fact: BitSetFactory[i.BitSet])
46+
: CanBuildFrom[Any, Int, ImmutableBitSetCC[Int]] =
47+
simpleCBF(fact.newBuilder)
48+
49+
implicit def mutableBitSetFactoryToCBF(fact: BitSetFactory[m.BitSet])
50+
: CanBuildFrom[Any, Int, MutableBitSetCC[Int]] =
51+
simpleCBF(fact.newBuilder)
52+
53+
implicit class IterableFactoryExtensionMethods[CC[X] <: GenTraversable[X]](
54+
private val fact: GenericCompanion[CC]) {
55+
def from[A](source: TraversableOnce[A]): CC[A] =
56+
fact.apply(source.toSeq: _*)
57+
}
58+
59+
implicit class MapFactoryExtensionMethods[
60+
CC[A, B] <: Map[A, B] with MapLike[A, B, CC[A, B]]](
61+
private val fact: MapFactory[CC]) {
62+
def from[K, V](source: TraversableOnce[(K, V)]): CC[K, V] =
63+
fact.apply(source.toSeq: _*)
64+
}
65+
66+
implicit class BitSetFactoryExtensionMethods[
67+
C <: scala.collection.BitSet with scala.collection.BitSetLike[C]](
68+
private val fact: BitSetFactory[C]) {
69+
def fromSpecific(source: TraversableOnce[Int]): C =
70+
fact.apply(source.toSeq: _*)
71+
}
72+
73+
private[compat] def build[T, CC](builder: m.Builder[T, CC],
74+
source: TraversableOnce[T]): CC = {
75+
builder ++= source
76+
builder.result()
77+
}
78+
79+
// This really belongs into scala.collection but there's already a package object
80+
// in scala-library so we can't add to it
81+
type IterableOnce[+X] = c.TraversableOnce[X]
82+
val IterableOnce = c.TraversableOnce
83+
}
84+
85+
class ImmutableSortedMapExtensions(private val fact: i.SortedMap.type) extends AnyVal {
86+
def from[K: Ordering, V](source: TraversableOnce[(K, V)]): i.SortedMap[K, V] =
87+
build(i.SortedMap.newBuilder[K, V], source)
88+
}
89+
90+
class ImmutableListMapExtensions(private val fact: i.ListMap.type) extends AnyVal {
91+
def from[K, V](source: TraversableOnce[(K, V)]): i.ListMap[K, V] =
92+
build(i.ListMap.newBuilder[K, V], source)
93+
}
94+
95+
class ImmutableHashMapExtensions(private val fact: i.HashMap.type) extends AnyVal {
96+
def from[K, V](source: TraversableOnce[(K, V)]): i.HashMap[K, V] =
97+
build(i.HashMap.newBuilder[K, V], source)
98+
}
99+
100+
class ImmutableTreeMapExtensions(private val fact: i.TreeMap.type) extends AnyVal {
101+
def from[K: Ordering, V](source: TraversableOnce[(K, V)]): i.TreeMap[K, V] =
102+
build(i.TreeMap.newBuilder[K, V], source)
103+
}
104+
105+
class ImmutableIntMapExtensions(private val fact: i.IntMap.type) extends AnyVal {
106+
def from[V](source: TraversableOnce[(Int, V)]): i.IntMap[V] =
107+
build(i.IntMap.canBuildFrom[Int, V](), source)
108+
}
109+
110+
class ImmutableLongMapExtensions(private val fact: i.LongMap.type) extends AnyVal {
111+
def from[V](source: TraversableOnce[(Long, V)]): i.LongMap[V] =
112+
build(i.LongMap.canBuildFrom[Long, V](), source)
113+
}
114+
115+
class MutableLongMapExtensions(private val fact: m.LongMap.type) extends AnyVal {
116+
def from[V](source: TraversableOnce[(Long, V)]): m.LongMap[V] =
117+
build(m.LongMap.canBuildFrom[Long, V](), source)
118+
}
119+
120+
class MutableHashMapExtensions(private val fact: m.HashMap.type) extends AnyVal {
121+
def from[K, V](source: TraversableOnce[(K, V)]): m.HashMap[K, V] =
122+
build(m.HashMap.canBuildFrom[K, V](), source)
123+
}
124+
125+
class MutableListMapExtensions(private val fact: m.ListMap.type) extends AnyVal {
126+
def from[K, V](source: TraversableOnce[(K, V)]): m.ListMap[K, V] =
127+
build(m.ListMap.canBuildFrom[K, V](), source)
128+
}
129+
130+
class MutableMapExtensions(private val fact: m.Map.type) extends AnyVal {
131+
def from[K, V](source: TraversableOnce[(K, V)]): m.Map[K, V] =
132+
build(m.Map.canBuildFrom[K, V](), source)
133+
}
134+
135+
class StreamExtensionMethods[A](private val stream: Stream[A]) extends AnyVal {
136+
def lazyAppendedAll(as: => TraversableOnce[A]): Stream[A] = stream.append(as)
137+
}
138+
139+
class SortedExtensionMethods[K, T <: Sorted[K, T]](private val fact: Sorted[K, T]) {
140+
def rangeFrom(from: K): T = fact.from(from)
141+
def rangeTo(to: K): T = fact.to(to)
142+
def rangeUntil(until: K): T = fact.until(until)
143+
}
144+
145+
class IteratorExtensionMethods[A](private val self: c.Iterator[A]) extends AnyVal {
146+
def sameElements[B >: A](that: c.TraversableOnce[B]): Boolean = {
147+
self.sameElements(that.iterator)
148+
}
149+
def concat[B >: A](that: c.TraversableOnce[B]): c.TraversableOnce[B] = self ++ that
150+
}
151+
152+
class TraversableOnceExtensionMethods[A](private val self: c.TraversableOnce[A]) extends AnyVal {
153+
def iterator: Iterator[A] = self.toIterator
154+
}

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

Lines changed: 0 additions & 111 deletions
This file was deleted.
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package scala.collection
2+
3+
import scala.collection.generic._
4+
import scala.collection.{immutable => i, mutable => m}
5+
6+
package object compat extends compat.PackageShared {
7+
implicit def toImmutableSortedMapExtensions(fact: i.SortedMap.type): compat.ImmutableSortedMapExtensions =
8+
new compat.ImmutableSortedMapExtensions(fact)
9+
10+
implicit def toImmutableListMapExtensions(fact: i.ListMap.type): compat.ImmutableListMapExtensions =
11+
new compat.ImmutableListMapExtensions(fact)
12+
13+
implicit def toImmutableHashMapExtensions(fact: i.HashMap.type): compat.ImmutableHashMapExtensions =
14+
new compat.ImmutableHashMapExtensions(fact)
15+
16+
implicit def toImmutableTreeMapExtensions(fact: i.TreeMap.type): compat.ImmutableTreeMapExtensions =
17+
new compat.ImmutableTreeMapExtensions(fact)
18+
19+
implicit def toImmutableIntMapExtensions(fact: i.IntMap.type): compat.ImmutableIntMapExtensions =
20+
new compat.ImmutableIntMapExtensions(fact)
21+
22+
implicit def toImmutableLongMapExtensions(fact: i.LongMap.type): compat.ImmutableLongMapExtensions =
23+
new compat.ImmutableLongMapExtensions(fact)
24+
25+
implicit def toMutableLongMapExtensions(fact: m.LongMap.type): compat.MutableLongMapExtensions =
26+
new compat.MutableLongMapExtensions(fact)
27+
28+
implicit def toMutableHashMapExtensions(fact: m.HashMap.type): compat.MutableHashMapExtensions =
29+
new compat.MutableHashMapExtensions(fact)
30+
31+
implicit def toMutableListMapExtensions(fact: m.ListMap.type): compat.MutableListMapExtensions =
32+
new compat.MutableListMapExtensions(fact)
33+
34+
implicit def toMutableMapExtensions(fact: m.Map.type): compat.MutableMapExtensions =
35+
new compat.MutableMapExtensions(fact)
36+
37+
implicit def toStreamExtensionMethods[A](stream: Stream[A]): compat.StreamExtensionMethods[A] =
38+
new compat.StreamExtensionMethods[A](stream)
39+
40+
implicit def toSortedExtensionMethods[K, V <: Sorted[K, V]](fact: Sorted[K, V]): compat.SortedExtensionMethods[K, V] =
41+
new compat.SortedExtensionMethods[K, V](fact)
42+
43+
implicit def toIteratorExtensionMethods[A](self: Iterator[A]): compat.IteratorExtensionMethods[A] =
44+
new compat.IteratorExtensionMethods[A](self)
45+
46+
implicit def toTraversableOnceExtensionMethods[A](self: TraversableOnce[A]): compat.TraversableOnceExtensionMethods[A] =
47+
new compat.TraversableOnceExtensionMethods[A](self)
48+
49+
implicit class MutableTreeMapExtensions2(private val fact: m.TreeMap.type) extends AnyVal {
50+
def from[K: Ordering, V](source: TraversableOnce[(K, V)]): m.TreeMap[K, V] =
51+
build(m.TreeMap.newBuilder[K, V], source)
52+
}
53+
54+
implicit class MutableSortedMapExtensions(private val fact: m.SortedMap.type) extends AnyVal {
55+
def from[K: Ordering, V](source: TraversableOnce[(K, V)]): m.SortedMap[K, V] =
56+
build(m.SortedMap.newBuilder[K, V], source)
57+
}
58+
}
59+
60+

0 commit comments

Comments
 (0)