Skip to content

Commit 8409b97

Browse files
committed
Provide explicit type arguments for Lst
This is needed since otherwise Nothing would be inferred, which screws up use-site type inference.
1 parent 8ca2534 commit 8409b97

File tree

2 files changed

+137
-30
lines changed

2 files changed

+137
-30
lines changed

tests/run/lst/Lst.scala

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -60,16 +60,16 @@ class Lst[+T](val elems: Any) extends AnyVal {
6060
}
6161

6262
/** `f` is pulled out, not duplicated */
63-
@inline def map[U](@inline f: T => U): Lst[U] = {
63+
inline def map[U](inline f: T => U): Lst[U] = {
6464
def op(x: T) = f(x)
6565
elems match {
6666
case null => Empty
6767
case elems: Array[Any] => def elem(i: Int) = elems(i).asInstanceOf[T]
6868
val newElems = new Array[Any](elems.length)
6969
var i = 0
7070
while (i < elems.length) { newElems(i) = op(elem(i)); i += 1 }
71-
new Lst(newElems)
72-
case elem: T @ unchecked => new Lst(op(elem))
71+
new Lst[U](newElems)
72+
case elem: T @ unchecked => new Lst[U](op(elem))
7373
}
7474
}
7575

@@ -89,8 +89,8 @@ class Lst[+T](val elems: Any) extends AnyVal {
8989
}
9090
i += 1
9191
}
92-
if (newElems == null) this.asInstanceOf[Lst[U]] else new Lst(newElems)
93-
case elem: T @ unchecked => new Lst(f(elem))
92+
if (newElems == null) this.asInstanceOf[Lst[U]] else new Lst[U](newElems)
93+
case elem: T @ unchecked => new Lst[U](f(elem))
9494
}
9595

9696
def flatMap[U](f: T => Lst[U]): Lst[U] = elems match {
@@ -109,21 +109,21 @@ class Lst[+T](val elems: Any) extends AnyVal {
109109
else if (len == 1) {
110110
i = 0
111111
while (newElemss(i) == null) i += 1
112-
new Lst(newElemss(i))
112+
new Lst[U](newElemss(i))
113113
}
114114
else {
115115
val newElems = new Array[Any](len)
116116
i = 0
117117
var j = 0
118118
while (i < newElemss.length) {
119-
val ys = new Lst(newElemss(i))
119+
val ys = new Lst[U](newElemss(i))
120120
ys.copyToArray(newElems, j)
121121
j += ys.length
122122
i += 1
123123
}
124-
new Lst(newElems)
124+
new Lst[U](newElems)
125125
}
126-
case elem: T @ unchecked => new Lst(f(elem).elems)
126+
case elem: T @ unchecked => new Lst[U](f(elem).elems)
127127
}
128128

129129
def filter(p: T => Boolean): Lst[T] = elems match {
@@ -214,7 +214,7 @@ class Lst[+T](val elems: Any) extends AnyVal {
214214
newElems(elems.length - 1 - i) = elem(i)
215215
i += 1
216216
}
217-
new Lst(newElems)
217+
new Lst[T](newElems)
218218
case _ => this
219219
}
220220

@@ -252,7 +252,7 @@ class Lst[+T](val elems: Any) extends AnyVal {
252252
val newElems = new Array[Any](len1 + len2)
253253
this.copyToArray(newElems, 0)
254254
that.copyToArray(newElems, len1)
255-
new Lst(newElems)
255+
new Lst[U](newElems)
256256
}
257257

258258
def zipWith[U, V](that: Lst[U])(op: (T, U) => V): Lst[V] =
@@ -264,7 +264,7 @@ class Lst[+T](val elems: Any) extends AnyVal {
264264
case elems2: Array[Any] => def elem2(i: Int) = elems2(i).asInstanceOf[U]
265265
val len = elems1.length min elems2.length
266266
if (len == 0) Empty
267-
else if (len == 1) new Lst(op(elem1(0), elem2(0)))
267+
else if (len == 1) new Lst[V](op(elem1(0), elem2(0)))
268268
else {
269269
var newElems: Array[Any] = null
270270
var i = 0
@@ -279,17 +279,17 @@ class Lst[+T](val elems: Any) extends AnyVal {
279279
}
280280
i += 1
281281
}
282-
new Lst(newElems)
282+
new Lst[V](newElems)
283283
}
284284
case elem2: U @unchecked =>
285-
new Lst(op(elem1(0), elem2))
285+
new Lst[V](op(elem1(0), elem2))
286286
}
287287
case elem1: T @unchecked =>
288288
that.elems match {
289289
case null => Empty
290290
case elems2: Array[Any] => def elem2(i: Int) = elems2(i).asInstanceOf[U]
291-
new Lst(op(elem1, elem2(0)))
292-
case elem2: U @unchecked => new Lst(op(elem1, elem2))
291+
new Lst[V](op(elem1, elem2(0)))
292+
case elem2: U @unchecked => new Lst[V](op(elem1, elem2))
293293
}
294294
}
295295

@@ -301,9 +301,9 @@ class Lst[+T](val elems: Any) extends AnyVal {
301301
val newElems = new Array[Any](elems.length)
302302
var i = 0
303303
while (i < elems.length) { newElems(i) = (elem(i), i); i += 1 }
304-
new Lst(newElems)
304+
new Lst[(T, Int)](newElems)
305305
case elem: T @unchecked =>
306-
new Lst((elem, 0))
306+
new Lst[(T, Int)]((elem, 0))
307307
}
308308

309309
def corresponds[U](that: Lst[U])(p: (T, U) => Boolean): Boolean =
@@ -377,25 +377,25 @@ object Lst {
377377
private def eq(x: Any, y: Any) = x.asInstanceOf[AnyRef] `eq` y.asInstanceOf[AnyRef]
378378
private val eqFn = (x: Any, y: Any) => eq(x, y)
379379

380-
val Empty = new Lst(null)
380+
val Empty = new Lst[Nothing](null)
381381

382382
def apply[T](): Lst[T] = Empty
383383

384-
def apply[T](x0: T): Lst[T] = new Lst(x0)
384+
def apply[T](x0: T): Lst[T] = new Lst[T](x0)
385385

386386
def apply[T](x0: T, x1: T): Lst[T] = {
387387
val elems = new Arr(2)
388388
elems(0) = x0
389389
elems(1) = x1
390-
new Lst(elems)
390+
new Lst[T](elems)
391391
}
392392

393393
def apply[T](x0: T, x1: T, x2: T): Lst[T] = {
394394
val elems = new Arr(3)
395395
elems(0) = x0
396396
elems(1) = x1
397397
elems(2) = x2
398-
new Lst(elems)
398+
new Lst[T](elems)
399399
}
400400

401401
def apply[T](x0: T, x1: T, x2: T, x3: T): Lst[T] = {
@@ -404,7 +404,7 @@ object Lst {
404404
elems(1) = x1
405405
elems(2) = x2
406406
elems(3) = x3
407-
new Lst(elems)
407+
new Lst[T](elems)
408408
}
409409

410410
def apply[T](x0: T, x1: T, x2: T, x3: T, x4: T, xs: T*): Lst[T] = {
@@ -415,14 +415,14 @@ object Lst {
415415
elems(3) = x3
416416
elems(4) = x4
417417
xs.copyToArray(elems, 5)
418-
new Lst(elems)
418+
new Lst[T](elems)
419419
}
420420

421421
def fill[T](n: Int)(elem: => T) = {
422422
val elems = new Arr(n)
423423
var i = 0
424424
while (i < n) { elems(i) = elem; i += 1}
425-
new Lst(elems)
425+
new Lst[T](elems)
426426
}
427427

428428
class Buffer[T] {
@@ -471,7 +471,7 @@ object Lst {
471471

472472
def toLst: Lst[T] =
473473
if (len == 0) Empty
474-
else if (len == 1) new Lst(elem)
474+
else if (len == 1) new Lst[T](elem)
475475
else _fromArray(elems, 0, len)
476476

477477
def clear() =
@@ -481,12 +481,12 @@ object Lst {
481481
private def _fromArray[T](elems: Arr, start: Int, end: Int): Lst[T] = {
482482
val len = end - start
483483
if (len <= 0) Empty
484-
else if (len == 1) new Lst(elems(start))
485-
else if (start == 0 && end == elems.length) new Lst(elems)
484+
else if (len == 1) new Lst[T](elems(start))
485+
else if (start == 0 && end == elems.length) new Lst[T](elems)
486486
else {
487487
val newElems = new Arr(len)
488488
System.arraycopy(elems, start, newElems, 0, len)
489-
new Lst(newElems)
489+
new Lst[T](newElems)
490490
}
491491
}
492492

0 commit comments

Comments
 (0)