Skip to content

Commit 092a49d

Browse files
author
Antoine Brunner
committed
Add explicit type casts everywhere needed
1 parent 94439fc commit 092a49d

File tree

3 files changed

+78
-40
lines changed

3 files changed

+78
-40
lines changed

library/src-bootstrapped/scala/IArray.scala

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -42,49 +42,49 @@ object opaques
4242
/** All the methods on Array[T] that don't mutate in-place can be used with IArray[T].
4343
*/
4444
def [T, U >: T: ClassTag](arr: IArray[T]) ++(that: IArray[U]): IArray[U] =
45-
(arr.asInstanceOf[Array[T]] ++ that.asInstanceOf[Array[U]]).asInstanceOf
45+
(arr.asInstanceOf[Array[T]] ++ that.asInstanceOf[Array[U]]).asInstanceOf[IArray[U]]
4646

47-
def [T](arr: IArray[T])contains(elem: T): Boolean =
47+
def [T](arr: IArray[T]) contains(elem: T): Boolean =
4848
arr.asInstanceOf[Array[T]].contains(elem)
4949

5050
def [T](arr: IArray[T]) count(p: T => Boolean): Int =
5151
arr.asInstanceOf[Array[T]].count(p)
5252

5353
def [T](arr: IArray[T]) drop(n: Int): IArray[T] =
54-
arr.asInstanceOf[Array[T]].drop(n).asInstanceOf
54+
arr.asInstanceOf[Array[T]].drop(n).asInstanceOf[IArray[T]]
5555

5656
def [T](arr: IArray[T]) dropRight(n: Int): IArray[T] =
57-
arr.asInstanceOf[Array[T]].dropRight(n).asInstanceOf
57+
arr.asInstanceOf[Array[T]].dropRight(n).asInstanceOf[IArray[T]]
5858

5959
def [T](arr: IArray[T]) dropWhile(p: T => Boolean): IArray[T] =
60-
arr.asInstanceOf[Array[T]].dropWhile(p).asInstanceOf
60+
arr.asInstanceOf[Array[T]].dropWhile(p).asInstanceOf[IArray[T]]
6161

6262
def [T](arr: IArray[T]) exists(p: T => Boolean): IArray[T] =
63-
arr.asInstanceOf[Array[T]].exists(p).asInstanceOf
63+
arr.asInstanceOf[Array[T]].exists(p).asInstanceOf[IArray[T]]
6464

6565
def [T](arr: IArray[T]) filter(p: T => Boolean): IArray[T] =
66-
arr.asInstanceOf[Array[T]].filter(p).asInstanceOf
66+
arr.asInstanceOf[Array[T]].filter(p).asInstanceOf[IArray[T]]
6767

6868
def [T](arr: IArray[T]) filterNot(p: T => Boolean): IArray[T] =
69-
arr.asInstanceOf[Array[T]].filterNot(p).asInstanceOf
69+
arr.asInstanceOf[Array[T]].filterNot(p).asInstanceOf[IArray[T]]
7070

7171
def [T](arr: IArray[T]) find(p: T => Boolean): Option[T] =
72-
arr.asInstanceOf[Array[T]].find(p).asInstanceOf
72+
arr.asInstanceOf[Array[T]].find(p)
7373

7474
def [T, U: ClassTag](arr: IArray[T]) flatMap(f: T => IterableOnce[U]): IArray[U] =
75-
arr.asInstanceOf[Array[T]].flatMap(f).asInstanceOf
75+
arr.asInstanceOf[Array[T]].flatMap(f).asInstanceOf[IArray[U]]
7676

7777
def [T, U: ClassTag](arr: IArray[T]) flatten(given T => Iterable[U]): IArray[U] =
78-
arr.asInstanceOf[Array[T]].flatten.asInstanceOf
78+
arr.asInstanceOf[Array[T]].flatten.asInstanceOf[IArray[U]]
7979

8080
def [T, U >: T: ClassTag](arr: IArray[T]) fold(z: U)(op: (U, U) => U): U =
81-
arr.asInstanceOf[Array[T]].fold(z)(op).asInstanceOf
81+
arr.asInstanceOf[Array[T]].fold(z)(op)
8282

8383
def [T, U >: T: ClassTag](arr: IArray[T]) foldLeft(z: U)(op: (U, T) => U): U =
84-
arr.asInstanceOf[Array[T]].foldLeft(z)(op).asInstanceOf
84+
arr.asInstanceOf[Array[T]].foldLeft(z)(op)
8585

8686
def [T, U >: T: ClassTag](arr: IArray[T]) foldRight(z: U)(op: (T, U) => U): U =
87-
arr.asInstanceOf[Array[T]].foldRight(z)(op).asInstanceOf
87+
arr.asInstanceOf[Array[T]].foldRight(z)(op)
8888

8989
def [T](arr: IArray[T]) forall(p: T => Boolean): Boolean =
9090
arr.asInstanceOf[Array[T]].forall(p)
@@ -105,10 +105,10 @@ object opaques
105105
arr.asInstanceOf[Array[T]].indexWhere(p, from)
106106

107107
def [T](arr: IArray[T]) indices: Range =
108-
arr.asInstanceOf[Array[T]].indices.asInstanceOf
108+
arr.asInstanceOf[Array[T]].indices
109109

110110
def [T](arr: IArray[T]) init: IArray[T] =
111-
arr.asInstanceOf[Array[T]].init.asInstanceOf
111+
arr.asInstanceOf[Array[T]].init.asInstanceOf[IArray[T]]
112112

113113
def [T](arr: IArray[T]) isEmpty: Boolean =
114114
arr.asInstanceOf[Array[T]].isEmpty
@@ -129,7 +129,7 @@ object opaques
129129
arr.asInstanceOf[Array[T]].lastIndexWhere(p, from)
130130

131131
def [T, U: ClassTag](arr: IArray[T]) map(f: T => U): IArray[U] =
132-
arr.asInstanceOf[Array[T]].map(f).asInstanceOf
132+
arr.asInstanceOf[Array[T]].map(f).asInstanceOf[IArray[U]]
133133

134134
def [T](arr: IArray[T]) nonEmpty: Boolean =
135135
arr.asInstanceOf[Array[T]].nonEmpty
@@ -140,31 +140,31 @@ object opaques
140140
}
141141

142142
def [T](arr: IArray[T]) reverse: IArray[T] =
143-
arr.asInstanceOf[Array[T]].reverse.asInstanceOf
143+
arr.asInstanceOf[Array[T]].reverse.asInstanceOf[IArray[T]]
144144

145-
def [T, U >: T: ClassTag](arr: IArray[T]) scan(z: U)(op: (U, U) => U): Array[U] =
146-
arr.asInstanceOf[Array[T]].scan(z)(op).asInstanceOf
145+
def [T, U >: T: ClassTag](arr: IArray[T]) scan(z: U)(op: (U, U) => U): IArray[U] =
146+
arr.asInstanceOf[Array[T]].scan(z)(op).asInstanceOf[IArray[U]]
147147

148-
def [T, U: ClassTag](arr: IArray[T]) scanLeft(z: U)(op: (U, T) => U): Array[U] =
149-
arr.asInstanceOf[Array[T]].scanLeft(z)(op).asInstanceOf
148+
def [T, U: ClassTag](arr: IArray[T]) scanLeft(z: U)(op: (U, T) => U): IArray[U] =
149+
arr.asInstanceOf[Array[T]].scanLeft(z)(op).asInstanceOf[IArray[U]]
150150

151-
def [T, U: ClassTag](arr: IArray[T]) scanRight(z: U)(op: (T, U) => U): Array[U] =
152-
arr.asInstanceOf[Array[T]].scanRight(z)(op).asInstanceOf
151+
def [T, U: ClassTag](arr: IArray[T]) scanRight(z: U)(op: (T, U) => U): IArray[U] =
152+
arr.asInstanceOf[Array[T]].scanRight(z)(op).asInstanceOf[IArray[U]]
153153

154154
def [T](arr: IArray[T]) size: Int =
155155
arr.asInstanceOf[Array[T]].size
156156

157-
def [T](arr: IArray[T]) slice(from: Int, until: Int): Array[T] =
158-
arr.asInstanceOf[Array[T]].slice(from, until).asInstanceOf
157+
def [T](arr: IArray[T]) slice(from: Int, until: Int): IArray[T] =
158+
arr.asInstanceOf[Array[T]].slice(from, until).asInstanceOf[IArray[T]]
159159

160160
def [T, U: ClassTag](arr: IArray[T]) sortBy(f: T => U)(given math.Ordering[U]): IArray[T] =
161-
arr.asInstanceOf[Array[T]].sortBy(f).asInstanceOf
161+
arr.asInstanceOf[Array[T]].sortBy(f).asInstanceOf[IArray[T]]
162162

163163
def [T](arr: IArray[T]) sortWith(f: (T, T) => Boolean): IArray[T] =
164-
arr.asInstanceOf[Array[T]].sortWith(f).asInstanceOf
164+
arr.asInstanceOf[Array[T]].sortWith(f).asInstanceOf[IArray[T]]
165165

166166
def [T](arr: IArray[T]) sorted(given math.Ordering[T]): IArray[T] =
167-
arr.asInstanceOf[Array[T]].sorted.asInstanceOf
167+
arr.asInstanceOf[Array[T]].sorted.asInstanceOf[IArray[T]]
168168

169169
def [T](arr: IArray[T]) span(p: T => Boolean): (IArray[T], IArray[T]) =
170170
arr.asInstanceOf[Array[T]].span(p) match {
@@ -180,24 +180,24 @@ object opaques
180180
arr.asInstanceOf[Array[T]].startsWith(that.asInstanceOf[Array[U]])
181181

182182
def [T](arr: IArray[T]) tail: IArray[T] =
183-
arr.asInstanceOf[Array[T]].tail.asInstanceOf
183+
arr.asInstanceOf[Array[T]].tail.asInstanceOf[IArray[T]]
184184

185185
def [T](arr: IArray[T]) take(n: Int): IArray[T] =
186-
arr.asInstanceOf[Array[T]].take(n).asInstanceOf
186+
arr.asInstanceOf[Array[T]].take(n).asInstanceOf[IArray[T]]
187187

188188
def [T](arr: IArray[T]) takeRight(n: Int): IArray[T] =
189-
arr.asInstanceOf[Array[T]].takeRight(n).asInstanceOf
189+
arr.asInstanceOf[Array[T]].takeRight(n).asInstanceOf[IArray[T]]
190190

191191
def [T](arr: IArray[T]) takeWhile(p: T => Boolean): IArray[T] =
192-
arr.asInstanceOf[Array[T]].takeWhile(p).asInstanceOf
192+
arr.asInstanceOf[Array[T]].takeWhile(p).asInstanceOf[IArray[T]]
193193

194194
def [U: ClassTag, V: ClassTag](arr: IArray[(U, V)]) unzip: (IArray[U], IArray[V]) =
195195
arr.asInstanceOf[Array[(U, V)]].unzip match {
196196
case (x, y) => (x.asInstanceOf[IArray[U]], y.asInstanceOf[IArray[V]])
197197
}
198198

199199
def [T, U: ClassTag](arr: IArray[T]) zip(that: IterableOnce[U]): IArray[(T, U)] =
200-
arr.asInstanceOf[Array[T]].zip(that).asInstanceOf
200+
arr.asInstanceOf[Array[T]].zip(that).asInstanceOf[IArray[(T, U)]]
201201
end opaques
202202

203203
type IArray[+T] = opaques.IArray[T]
Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,11 @@
1-
IArray(1,2)
1+
IArray(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
2+
true
3+
false
4+
5
5+
IArray(9, 10)
6+
IArray(1, 2)
7+
IArray(8, 9, 10)
8+
true
9+
IArray(2, 4, 6, 8, 10)
10+
IArray(1, 3, 5, 7, 9)
11+
Some(5)
Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,40 @@
11

22
object Test extends App {
3-
def assertNew[T, U](expr: => IArray[T], original: IArray[U]): Unit = {
3+
def arrToString[T](arr: IArray[T]): Unit =
4+
arr.asInstanceOf[Array[T]].mkString("IArray(", ", ", ")")
5+
6+
// This is used to check the correct result, as well as checking that the IArray was not mutated in place
7+
def assertNew[T, U](expr: => IArray[T], sources: IArray[U]*): Unit = {
48
val result = expr
5-
assert(result ne original, "IArray was mutated in place")
6-
println(result)
9+
10+
sources.foreach(source =>
11+
assert(result.asInstanceOf[AnyRef] ne source.asInstanceOf[AnyRef], "IArray was mutated in place")
12+
)
13+
14+
println(arrToString(result))
715
}
816

9-
val arr = Array[Int](1,2,3,4,5,6,7,8,9,10)
17+
val arr1 = IArray[Int](1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
18+
val arr2 = IArray[Int](11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
19+
20+
assertNew(arr1 ++ arr2, arr1, arr2)
21+
22+
println(arr1.contains(1))
23+
println(arr1.contains(25))
24+
25+
println(arr1.count(_ % 2 == 0))
26+
27+
assertNew(arr1.drop(8), arr1)
28+
29+
assertNew(arr1.dropRight(8), arr1)
30+
31+
assertNew(arr1.dropWhile(_ < 8))
32+
33+
println(arr1.exists(_ % 6 == 0))
34+
35+
assertNew(arr1.filter(_ % 2 == 0), arr1)
36+
37+
assertNew(arr1.filterNot(_ % 2 == 0), arr1)
1038

11-
assertNew(arr.filter(_ % 2 == 0), arr)
39+
println(arr1.find(_ % 5 == 0))
1240
}

0 commit comments

Comments
 (0)