Skip to content

Commit 7312b59

Browse files
Cross-compatible breakOut for specific collections like SortedMap
1 parent a0e28ad commit 7312b59

File tree

6 files changed

+435
-246
lines changed

6 files changed

+435
-246
lines changed

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

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,84 @@ package object compat {
6565
def iterator: Iterator[A] = self.toIterator
6666
}
6767

68+
implicit class TraversableOnceKVExtensionMethods[K, V](private val self: TraversableOnce[(K, V)]) extends AnyVal {
69+
def toImmutableSortedMap(implicit ordering: Ordering[K]): i.SortedMap[K, V] = {
70+
val b = i.SortedMap.canBuildFrom[K, V](ordering)()
71+
b ++= self
72+
b.result()
73+
}
74+
75+
def toImmutableHashMap: i.HashMap[K, V] = {
76+
val b = i.HashMap.canBuildFrom[K, V]()
77+
b ++= self
78+
b.result()
79+
}
80+
81+
def toImmutableListMap: i.ListMap[K, V] = {
82+
val b = i.ListMap.canBuildFrom[K, V]()
83+
b ++= self
84+
b.result()
85+
}
86+
87+
def toImmutableTreeMap(implicit ordering: Ordering[K]): i.TreeMap[K, V] = {
88+
val b = i.TreeMap.canBuildFrom[K, V](ordering)()
89+
b ++= self
90+
b.result()
91+
}
92+
93+
def toMutableSortedMap(implicit ordering: Ordering[K]): m.SortedMap[K, V] = {
94+
val b = m.SortedMap.canBuildFrom[K, V](ordering)()
95+
b ++= self
96+
b.result()
97+
}
98+
99+
def toMutableHashMap: m.HashMap[K, V] = {
100+
val b = m.HashMap.canBuildFrom[K, V]()
101+
b ++= self
102+
b.result()
103+
}
104+
105+
def toMutableListMap: m.ListMap[K, V] = {
106+
val b = m.ListMap.canBuildFrom[K, V]()
107+
b ++= self
108+
b.result()
109+
}
110+
111+
def toMutableTreeMap(implicit ordering: Ordering[K]): m.TreeMap[K, V] = {
112+
val b = m.TreeMap.canBuildFrom[K, V](ordering)()
113+
b ++= self
114+
b.result()
115+
}
116+
117+
def toMutableMap: m.Map[K, V] = {
118+
val b = m.Map.canBuildFrom[K, V]()
119+
b ++= self
120+
b.result()
121+
}
122+
}
123+
124+
implicit class TraversableOnceIntVExtensionMethods[V](private val self: TraversableOnce[(Int, V)]) extends AnyVal {
125+
def toImmutableIntMap: i.IntMap[V] = {
126+
val b = i.IntMap.canBuildFrom[Int, V]()
127+
b ++= self
128+
b.result()
129+
}
130+
}
131+
132+
implicit class TraversableOnceLongVExtensionMethods[V](private val self: TraversableOnce[(Long, V)]) extends AnyVal {
133+
def toImmutableLongMap: i.LongMap[V] = {
134+
val b = i.LongMap.canBuildFrom[Long, V]()
135+
b ++= self
136+
b.result()
137+
}
138+
139+
def toMutableLongMap: m.LongMap[V] = {
140+
val b = m.LongMap.canBuildFrom[Long, V]()
141+
b ++= self
142+
b.result()
143+
}
144+
}
145+
68146
// This really belongs into scala.collection but there's already a package object in scala-library so we can't add to it
69147
type IterableOnce[+X] = TraversableOnce[X]
70148
val IterableOnce = TraversableOnce

compat/src/main/scala-2.13/scala/collection/compat/package.scala

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package scala.collection
22

3+
import scala.collection.{immutable => i, mutable => m}
4+
35
package object compat {
46
type Factory[-A, +C] = scala.collection.Factory[A, C]
57
val Factory = scala.collection.Factory
@@ -9,4 +11,46 @@ package object compat {
911

1012
type IterableOnce[+X] = scala.collection.IterableOnce[X]
1113
val IterableOnce = scala.collection.IterableOnce
14+
15+
implicit class TraversableOnceKVExtensionMethods[K, V](private val self: IterableOnce[(K, V)]) extends AnyVal {
16+
def toImmutableSortedMap(implicit ordering: Ordering[K]): i.SortedMap[K, V] =
17+
i.SortedMap.from(self)
18+
19+
def toImmutableHashMap: i.HashMap[K, V] =
20+
i.HashMap.from(self)
21+
22+
def toImmutableListMap: i.ListMap[K, V] =
23+
i.ListMap.from(self)
24+
25+
def toImmutableTreeMap(implicit ordering: Ordering[K]): i.TreeMap[K, V] =
26+
i.TreeMap.from(self)
27+
28+
def toMutableSortedMap(implicit ordering: Ordering[K]): m.SortedMap[K, V] =
29+
m.SortedMap.from(self)
30+
31+
def toMutableHashMap: m.HashMap[K, V] =
32+
m.HashMap.from(self)
33+
34+
def toMutableListMap: m.ListMap[K, V] =
35+
m.ListMap.from(self)
36+
37+
def toMutableTreeMap(implicit ordering: Ordering[K]): m.TreeMap[K, V] =
38+
m.TreeMap.from(self)
39+
40+
def toMutableMap: m.Map[K, V] =
41+
m.Map.from(self)
42+
}
43+
44+
implicit class TraversableOnceIntVExtensionMethods[V](private val self: TraversableOnce[(Int, V)]) extends AnyVal {
45+
def toImmutableIntMap: i.IntMap[V] =
46+
i.IntMap.from(self)
47+
}
48+
49+
implicit class TraversableOnceLongVExtensionMethods[V](private val self: TraversableOnce[(Long, V)]) extends AnyVal {
50+
def toImmutableLongMap: i.LongMap[V] =
51+
i.LongMap.from(self)
52+
53+
def toMutableLongMap: m.LongMap[V] =
54+
m.LongMap.from(self)
55+
}
1256
}

scalafix/input/src/main/scala/fix/BreakoutSrc.scala

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ class BreakoutSrc(ts: Traversable[Int], vec: Vector[Int], list: List[Int], seq:
3434
// `List.map`
3535
list.map(x => x)(breakOut): Set[Int]
3636

37-
3837
// `SeqLike.reverseMap`
3938
seq.reverseMap(_ + 1)(breakOut): Set[Int]
4039

@@ -86,6 +85,24 @@ class BreakoutSrc(ts: Traversable[Int], vec: Vector[Int], list: List[Int], seq:
8685
// `Vector.updated`
8786
(vec.updated(0, 0))(breakOut): List[Int]
8887

88+
// Future
8989
Future.sequence(List(Future(1)))(breakOut, global): Future[Seq[Int]]
9090
Future.traverse(List(1))(x => Future(x))(breakOut, global): Future[Seq[Int]]
91+
92+
// Iterable
93+
List(1).map(x => x)(breakOut): Iterator[Int]
94+
95+
// Specific collections
96+
List(1 -> "1").map(x => x)(breakOut): immutable.SortedMap[Int, String]
97+
List(1 -> "1").map(x => x)(breakOut): immutable.HashMap[Int, String]
98+
List(1 -> "1").map(x => x)(breakOut): immutable.ListMap[Int, String]
99+
List(1 -> "1").map(x => x)(breakOut): immutable.TreeMap[Int, String]
100+
List(1 -> "1").map(x => x)(breakOut): mutable.SortedMap[Int, String]
101+
List(1 -> "1").map(x => x)(breakOut): mutable.HashMap[Int, String]
102+
List(1 -> "1").map(x => x)(breakOut): mutable.ListMap[Int, String]
103+
List(1 -> "1").map(x => x)(breakOut): mutable.TreeMap[Int, String]
104+
List(1 -> "1").map(x => x)(breakOut): mutable.Map[Int, String]
105+
List(1 -> "1").map(x => x)(breakOut): immutable.IntMap[String]
106+
List(1L -> "1").map(x => x)(breakOut): immutable.LongMap[String]
107+
List(1L -> "1").map(x => x)(breakOut): mutable.LongMap[String]
91108
}

scalafix/output212/src/main/scala/fix/BreakoutSrc.scala

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ class BreakoutSrc(ts: Iterable[Int], vec: Vector[Int], list: List[Int], seq: Seq
3434
// `List.map`
3535
list.iterator.map(x => x).to(scala.collection.immutable.Set): Set[Int]
3636

37-
3837
// `SeqLike.reverseMap`
3938
seq.reverseIterator.map(_ + 1).to(scala.collection.immutable.Set): Set[Int]
4039

@@ -86,6 +85,24 @@ class BreakoutSrc(ts: Iterable[Int], vec: Vector[Int], list: List[Int], seq: Seq
8685
// `Vector.updated`
8786
(vec.view.updated(0, 0)).to(scala.collection.immutable.List): List[Int]
8887

88+
// Future
8989
Future.sequence(List(Future(1)))(scala.collection.immutable.List, global): Future[Seq[Int]]
9090
Future.traverse(List(1))(x => Future(x))(scala.collection.immutable.List, global): Future[Seq[Int]]
91+
92+
// Iterable
93+
List(1).iterator.map(x => x): Iterator[Int]
94+
95+
// Specific collections
96+
List(1 -> "1").iterator.map(x => x).toImmutableSortedMap: immutable.SortedMap[Int, String]
97+
List(1 -> "1").iterator.map(x => x).toImmutableHashMap: immutable.HashMap[Int, String]
98+
List(1 -> "1").iterator.map(x => x).toImmutableListMap: immutable.ListMap[Int, String]
99+
List(1 -> "1").iterator.map(x => x).toImmutableTreeMap: immutable.TreeMap[Int, String]
100+
List(1 -> "1").iterator.map(x => x).toMutableSortedMap: mutable.SortedMap[Int, String]
101+
List(1 -> "1").iterator.map(x => x).toMutableHashMap: mutable.HashMap[Int, String]
102+
List(1 -> "1").iterator.map(x => x).toMutableListMap: mutable.ListMap[Int, String]
103+
List(1 -> "1").iterator.map(x => x).toMutableTreeMap: mutable.TreeMap[Int, String]
104+
List(1 -> "1").iterator.map(x => x).toMutableMap: mutable.Map[Int, String]
105+
List(1 -> "1").iterator.map(x => x).toImmutableIntMap: immutable.IntMap[String]
106+
List(1L -> "1").iterator.map(x => x).toImmutableLongMap: immutable.LongMap[String]
107+
List(1L -> "1").iterator.map(x => x).toMutableLongMap: mutable.LongMap[String]
91108
}

0 commit comments

Comments
 (0)