8000 Make js.ArrayOps and js.WrappedArray be their own Builders. · scala-js/scala-js@2a2e6c4 · GitHub 8000
[go: up one dir, main page]

Skip to content

Commit 2a2e6c4

Browse files
committed
Make js.ArrayOps and js.WrappedArray be their own Builders.
This is ok because the result() method of Builder clearly says that the builder's state is completely undefined after its invocation. For reference, scm.ArrayBuffer is also its own Builder.
1 parent 2d4058a commit 2a2e6c4

File tree

3 files changed

+44
-41
lines changed

3 files changed

+44
-41
lines changed

library/src/main/scala/scala/scalajs/js/ArrayOps.scala

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,15 @@ import mutable.Builder
1515

1616
/** Equivalent of scm.ArrayOps for js.Array */
1717
@inline
18-
class ArrayOps[A](private[this] val array: Array[A])
19-
extends mutable.ArrayLike[A, Array[A]] {
18+
final class ArrayOps[A](private[this] val array: Array[A])
19+
extends mutable.ArrayLike[A, Array[A]]
20+
with Builder[A, Array[A]] {
2021

2122
import ArrayOps._
2223

24+
/** Creates a new empty [[ArrayOps]]. */
25+
def this() = this(Array())
26+
2327
// Implementation of ArrayLike
2428

2529
@inline def apply(index: Int): A = array(index)
@@ -36,7 +40,19 @@ class ArrayOps[A](private[this] val array: Array[A])
3640
repr: Array[A]): mutable.IndexedSeq[A] = new WrappedArray(repr)
3741

3842
protected[this] def newBuilder: Builder[A, Array[A]] =
39-
new ArrayOps.ArrayBuilder
43+
new ArrayOps[A]
44+
45+
// Implementation of Builder
46+
47+
@inline def +=(elem: A): this.type = {
48+
array.push(elem)
49+
this
50+
}
51+
52+
@inline def clear(): Unit =
53+
array.length = 0
54+
55+
@inline def result(): Array[A] = array
4056

4157
// Scala notation for a fast concat()
4258

@@ -100,23 +116,4 @@ object ArrayOps {
100116
result
101117
}
102118

103-
@inline
104-
class ArrayBuilder[A] extends Builder[A, Array[A]] {
105-
private[this] var array: Array[A] = new Array
106-
107-
@inline
108-
def +=(elem: A): this.type = {
109-
array.push(elem)
110-
this
111-
}
112-
113-
@inline
114-
def clear(): Unit =
115-
array = new Array
116-
117-
@inline
118-
def result(): Array[A] =
119-
array
120-
}
121-
122119
}

library/src/main/scala/scala/scalajs/js/Primitives.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,9 @@ object Any extends LowPrioAnyImplicits {
5757
@inline
5858
class CanBuildFromArray extends CanBuildFrom[Array[_], A, Array[A]] {
5959
def apply(from: Array[_]): mutable.Builder[A, Array[A]] =
60-
new ArrayOps.ArrayBuilder[A]
60+
new ArrayOps[A]
6161
def apply(): mutable.Builder[A, Array[A]] =
62-
new ArrayOps.ArrayBuilder[A]
62+
new ArrayOps[A]
6363
}
6464
new CanBuildFromArray
6565
}

library/src/main/scala/scala/scalajs/js/WrappedArray.scala

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,40 +17,46 @@ import scala.collection.generic.CanBuildFrom
1717
class WrappedArray[A](val array: Array[A])
1818
extends mutable.AbstractSeq[A]
1919
with mutable.IndexedSeq[A]
20-
with mutable.ArrayLike[A, WrappedArray[A]] {
20+
with mutable.ArrayLike[A, WrappedArray[A]]
21+
with Builder[A, WrappedArray[A]] {
22+
23+
/** Creates a new empty [[WrappedArray]]. */
24+
def this() = this(Array())
25+
26+
// IndexedSeq interface
2127

2228
def update(index: Int, elem: A): Unit = array(index) = elem
2329
def apply(index: Int): A = array(index)
2430
def length: Int = array.length
2531

2632
override protected[this] def newBuilder: Builder[A, WrappedArray[A]] =
27-
new WrappedArray.WrappedArrayBuilder[A]
33+
new WrappedArray[A]
34+
35+
// Builder interface
36+
37+
@inline override def +=(elem: A): this.type = {
38+
array.push(elem)
39+
this
40+
}
41+
42+
@inline override def clear(): Unit =
43+
array.length = 0
44+
45+
@inline override def result(): WrappedArray[A] = this
2846

2947
}
3048

3149
object WrappedArray {
3250

33-
def empty[A]: WrappedArray[A] = new WrappedArray[A](Array())
51+
def empty[A]: WrappedArray[A] = new WrappedArray[A]
3452

3553
implicit def canBuildFrom[A]: CanBuildFrom[WrappedArray[_], A, WrappedArray[A]] = {
3654
new CanBuildFrom[WrappedArray[_], A, WrappedArray[A]] {
3755
def apply(from: WrappedArray[_]): Builder[A, WrappedArray[A]] =
38-
new WrappedArrayBuilder[A]
56+
new WrappedArray[A]
3957
def apply: Builder[A, WrappedArray[A]] =
40-
new WrappedArrayBuilder[A]
41-
}
42-
}
43-
44-
class WrappedArrayBuilder[A] extends Builder[A, WrappedArray[A]] {
45-
private[this] var array: Array[A] = new Array
46-
def +=(elem: A): this.type = {
47-
array.push(elem)
48-
this
58+
new WrappedArray[A]
4959
}
50-
def clear(): Unit =
51-
array = new Array
52-
def result(): WrappedArray[A] =
53-
new WrappedArray(array)
5460
}
5561

5662
}

0 commit comments

Comments
 (0)
0