Untitled diff

Created Diff never expires
2 removals
Lines
Total
Removed
Words
Total
Removed
To continue using this feature, upgrade to
Diffchecker logo
Diffchecker Pro
685 lines
3 additions
Lines
Total
Added
Words
Total
Added
To continue using this feature, upgrade to
Diffchecker logo
Diffchecker Pro
686 lines
dark@reco ~/workspace/dotty/tests/pos (fix-838) $ dotc Iter3.scala
parsed:
parsed:
package dotty1.collections {
package dotty1.collections {
package immutable {
package immutable {
import annotation.unchecked.uncheckedVariance
import annotation.unchecked.uncheckedVariance
module object Iter2 extends {
module object Iter2 extends {
<trait> trait Iterator[A] extends IterableOnce[A] {
<trait> trait Iterator[A] extends IterableOnce[A] {
def hasNext: Boolean
def hasNext: Boolean
def next: A
def next: A
def iterator = this
def iterator = this
def foreach(f: (A) => Unit): Unit = ???
def foreach(f: (A) => Unit): Unit = ???
def map[B](f: (A) => B): Iterator[B] = ???
def map[B](f: (A) => B): Iterator[B] = ???
def flatMap[B](f: (A) => IterableOnce[B]): Iterator[B] = ???
def flatMap[B](f: (A) => IterableOnce[B]): Iterator[B] = ???
def ++[B >: A](xs: IterableOnce[B]): Iterator[B] = ???
def ++[B >: A](xs: IterableOnce[B]): Iterator[B] = ???
def drop(n: Int): Iterator[A] = ???
def drop(n: Int): Iterator[A] = ???
def indexWhere(p: (A) => Boolean): Int = {
def indexWhere(p: (A) => Boolean): Int = {
var i = 0
var i = 0
while (hasNext) do {
while (hasNext) do {
if (p(next)) return i
if (p(next)) return i
i += 1
i += 1
}
}
-1
-1
}
}
def zip[B](that: Iterator[B]): Iterator[(A, B)] = ???
def zip[B](that: Iterator[B]): Iterator[(A, B)] = ???
}
}
<trait> trait IterableOnce[A] extends {
<trait> trait IterableOnce[A] extends {
def iterator: Iterator[A]
def iterator: Iterator[A]
def buildIterator: Iterator[A] = iterator
def buildIterator: Iterator[A] = iterator
}
}
<trait> trait FromIterator[C[X] <: Iterable[X]] extends {
<trait> trait FromIterator[C[X] <: Iterable[X]] extends {
def fromIterator[B](it: Iterator[B]): C[B]
def fromIterator[B](it: Iterator[B]): C[B]
}
}
<trait> trait Iterable[IA] extends IterableOnce[IA] with FromIterator[
<trait> trait Iterable[IA] extends IterableOnce[IA] with FromIterator[
Iterable
Iterable
] {}
] {}
<trait> trait Seq[AA] extends Iterable[AA] with FromIterator[Seq] {
<trait> trait Seq[AA] extends Iterable[AA] with FromIterator[Seq] {
def apply(i: Int): AA
def apply(i: Int): AA
def length: Int
def length: Int
}
}
<trait> sealed trait List[A] extends Seq[A] with FromIterator[List] {
<trait> sealed trait List[A] extends Seq[A] with FromIterator[List] {
def isEmpty: Boolean
def isEmpty: Boolean
def head: A
def head: A
def tail: List[A]
def tail: List[A]
def iterator = new ListIterator[A](this)
def iterator = new ListIterator[A](this)
def fromIterator[B](it: Iterator[B]): List[B] =
def fromIterator[B](it: Iterator[B]): List[B] =
it match {
it match {
case ListIterator(xs) =>
case ListIterator(xs) =>
xs
xs
case _ =>
case _ =>
if (it.hasNext) Cons(it.next, fromIterator(it)) else
if (it.hasNext) Cons(it.next, fromIterator(it)) else
Nil.asInstanceOf[List[B]]
Nil.asInstanceOf[List[B]]
}
}
def apply(i: Int): A = {
def apply(i: Int): A = {
require(! isEmpty)
require(! isEmpty)
if (i == 0) head else tail.apply(i - 1)
if (i == 0) head else tail.apply(i - 1)
}
}
def length: Int = if (isEmpty) 0 else 1 + tail.length
def length: Int = if (isEmpty) 0 else 1 + tail.length
}
}
case class Cons[A](val x: A, val xs: List[A]) extends List[A] {
case class Cons[A](val x: A, val xs: List[A]) extends List[A] {
def isEmpty = false
def isEmpty = false
def head = x
def head = x
def tail = xs
def tail = xs
}
}
module case object Nil extends List[Nothing] {
module case object Nil extends List[Nothing] {
def isEmpty = true
def isEmpty = true
def head = ???
def head = ???
def tail = ???
def tail = ???
}
}
class ArrayBuffer[A] private(private[this] val initElems: Array[AnyRef],
class ArrayBuffer[A] private(private[this] val initElems: Array[AnyRef],
private[this] val initLen: Int
private[this] val initLen: Int
) extends Seq[A] with FromIterator[ArrayBuffer] {
) extends Seq[A] with FromIterator[ArrayBuffer] {
def <init>() = {
def <init>() = {
<init>(new Array[AnyRef](16), 0)
<init>(new Array[AnyRef](16), 0)
()
()
}
}
def <init>(it: ArrayIterator[A]) = {
def <init>(it: ArrayIterator[A]) = {
<init>(it.elems, it.len)
<init>(it.elems, it.len)
()
()
}
}
private var elems: Array[AnyRef] = initElems
private var elems: Array[AnyRef] = initElems
private var len = 0
private var len = 0
def iterator = elems.iterator.take(len).asInstanceOf[Iterator[A]]
def iterator = elems.iterator.take(len).asInstanceOf[Iterator[A]]
override def buildIterator =
override def buildIterator =
new ArrayIterator(elems, len).asInstanceOf[Iterator[A]]
new ArrayIterator(elems, len).asInstanceOf[Iterator[A]]
def fromIterator[B](it: Iterator[B]): ArrayBuffer[B] =
def fromIterator[B](it: Iterator[B]): ArrayBuffer[B] =
new ArrayBuffer(ArrayIterator.fromIterator(it))
new ArrayBuffer(ArrayIterator.fromIterator(it))
def apply(i: Int) = elems(i).asInstanceOf[A]
def apply(i: Int) = elems(i).asInstanceOf[A]
def length = len
def length = len
}
}
implicit class IterableTransforms[A, C[X] <: Iterable[X]](
implicit class IterableTransforms[A, C[X] <: Iterable[X]](
val c: Iterable[A] & FromIterator[C]
val c: Iterable[A] & FromIterator[C]
) extends AnyVal {
) extends AnyVal {
def map[B](f: (A) => B): C[B] = c.fromIterator(c.buildIterator.map(f))
def map[B](f: (A) => B): C[B] = c.fromIterator(c.buildIterator.map(f))
def flatMap[B](f: (A) => IterableOnce[B]): C[B] =
def flatMap[B](f: (A) => IterableOnce[B]): C[B] =
c.fromIterator(c.buildIterator.flatMap(_$1 => f(_$1).buildIterator))
c.fromIterator(c.buildIterator.flatMap(_$1 => f(_$1).buildIterator))
def ++[B >: A](xs: IterableOnce[B]): C[B] =
def ++[B >: A](xs: IterableOnce[B]): C[B] =
c.fromIterator(c.buildIterator ++ xs.buildIterator)
c.fromIterator(c.buildIterator ++ xs.buildIterator)
def drop(n: Int): C[A] = c.fromIterator(c.buildIterator.drop(n))
def drop(n: Int): C[A] = c.fromIterator(c.buildIterator.drop(n))
def head: A = c.iterator.next
def head: A = c.iterator.next
def zip[B](xs: IterableOnce[B]): C[(A, B)] =
def zip[B](xs: IterableOnce[B]): C[(A, B)] =
c.fromIterator(c.iterator.zip(xs.iterator))
c.fromIterator(c.iterator.zip(xs.iterator))
}
}
implicit class SeqTransforms[SA, C[X] <: Seq[X]](
implicit class SeqTransforms[SA, C[X] <: Seq[X]](
val c: Seq[SA] & FromIterator[C]
val c: Seq[SA] & FromIterator[C]
) extends AnyVal {
) extends AnyVal {
def reverse: C[SA] = {
def reverse: C[SA] = {
val elems = new Array[AnyRef](c.length)
val elems = new Array[AnyRef](c.length)
var i = elems.length
var i = elems.length
val it = c.iterator
val it = c.iterator
while (it.hasNext) do {
while (it.hasNext) do {
i -= 1
i -= 1
elems(i) = it.next.asInstanceOf[AnyRef]
elems(i) = it.next.asInstanceOf[AnyRef]
}
}
val xzz = c.fromIterator(ArrayIterator[SA](elems, c.length))
val xzz = c.fromIterator(ArrayIterator[SA](elems, c.length))
xzz
xzz
}
}
def indexWhere(p: (SA) => Boolean): Int = c.iterator.indexWhere(p)
def indexWhere(p: (SA) => Boolean): Int = c.iterator.indexWhere(p)
}
}
case class ListIterator[A](val xs: List[A]) extends Iterator[A] {
case class ListIterator[A](val xs: List[A]) extends Iterator[A] {
private[this] var current: List[A] = xs
private[this] var current: List[A] = xs
def hasNext = ! current.isEmpty
def hasNext = ! current.isEmpty
def next = {
def next = {
val res = current.head
val res = current.head
current = current.tail
current = current.tail
res
res
}
}
}
}
case class ArrayIterator[A](val elems: Array[AnyRef], val len: Int)
case class ArrayIterator[A](val elems: Array[AnyRef], val len: Int)
extends
extends
Iterator[A] {
Iterator[A] {
import ArrayIterator._
import ArrayIterator._
private def elem(i: Int) = elems(i).asInstanceOf[A]
private def elem(i: Int) = elems(i).asInstanceOf[A]
private var cur = 0
private var cur = 0
def hasNext = cur < len
def hasNext = cur < len
def next = {
def next = {
val res = elem(cur)
val res = elem(cur)
cur += 1
cur += 1
res
res
}
}
override def foreach(f: (A) => Unit): Unit =
override def foreach(f: (A) => Unit): Unit =
for i <- 0 until len do f(elem(i))
for i <- 0 until len do f(elem(i))
override def map[B](f: (A) => B): ArrayIterator[B] = {
override def map[B](f: (A) => B): ArrayIterator[B] = {
var mapped = elems
var mapped = elems
for i <- 0 until len do {
for i <- 0 until len do {
val x = elem(i)
val x = elem(i)
val y = widen(f(x))
val y = widen(f(x))
if (widen(x) ne y) {
if (widen(x) ne y) {
if (mapped eq elems) mapped = new Array[AnyRef](len)
if (mapped eq elems) mapped = new Array[AnyRef](len)
mapped(i) = y
mapped(i) = y
}
}
}
}
if (mapped eq elems) this.asInstanceOf[ArrayIterator[B]] else
if (mapped eq elems) this.asInstanceOf[ArrayIterator[B]] else
new ArrayIterator(mapped, len)
new ArrayIterator(mapped, len)
}
}
override def flatMap[B](f: (A) => IterableOnce[B]): ArrayIterator[B] =
override def flatMap[B](f: (A) => IterableOnce[B]): ArrayIterator[B] =
flatten(map(_$2 => f(_$2).buildIterator))
flatten(map(_$2 => f(_$2).buildIterator))
override def ++[B >: A](that: IterableOnce[B]): ArrayIterator[B] = {
override def ++[B >: A](that: IterableOnce[B]): ArrayIterator[B] = {
val thatIterator @ ArrayIterator(elems2, len2) =
val thatIterator @ ArrayIterator(elems2, len2) =
fromIterator(that.iterator)
fromIterator(that.iterator)
if (len == 0) thatIterator else
if (len == 0) thatIterator else
if (len2 == 0) this.asInstanceOf[ArrayIterator[B]] else {
if (len2 == 0) this.asInstanceOf[ArrayIterator[B]] else {
val resLen = len + len2
val resLen = len + len2
val resElems = new Array[AnyRef](resLen)
val resElems = new Array[AnyRef](resLen)
Array.copy(elems, 0, resElems, 0, len)
Array.copy(elems, 0, resElems, 0, len)
Array.copy(elems2, 0, resElems, len, len2)
Array.copy(elems2, 0, resElems, len, len2)
new ArrayIterator(resElems, resLen)
new ArrayIterator(resElems, resLen)
}
}
}
}
}
}
module object ArrayIterator extends {
module object ArrayIterator extends {
private def widen(x: Any): AnyRef = x.asInstanceOf[AnyRef]
private def widen(x: Any): AnyRef = x.asInstanceOf[AnyRef]
def fromIterator[A](it: Iterator[A]): ArrayIterator[A] =
def fromIterator[A](it: Iterator[A]): ArrayIterator[A] =
it match {
it match {
case it: ArrayIterator[A] =>
case it: ArrayIterator[A] =>
it
it
case _ =>
case _ =>
var elems = new Array[AnyRef](32)
var elems = new Array[AnyRef](32)
var len = 0
var len = 0
def ensureCapacity() = {
def ensureCapacity() = {
while (len > elems.length) do {
while (len > elems.length) do {
val newElems = new Array[AnyRef](elems.length * 2)
val newElems = new Array[AnyRef](elems.length * 2)
Array.copy(elems, 0, newElems, 0, elems.length)
Array.copy(elems, 0, newElems, 0, elems.length)
elems = newElems
elems = newElems
}
}
}
}
while (it.hasNext) do {
while (it.hasNext) do {
len += 1
len += 1
ensureCapacity()
ensureCapacity()
elems(len - 1) = widen(it.next)
elems(len - 1) = widen(it.next)
}
}
ArrayIterator(elems, len)
ArrayIterator(elems, len)
}
}
def flatten[A](its: ArrayIterator[Iterator[A]]): ArrayIterator[A] = {
def flatten[A](its: ArrayIterator[Iterator[A]]): ArrayIterator[A] = {
var arrayIts = its.map(fromIterator)
var arrayIts = its.map(fromIterator)
var totalLen = 0
var totalLen = 0
arrayIts.foreach(_$3 => totalLen += _$3.len)
arrayIts.foreach(_$3 => totalLen += _$3.len)
val allElems = new Array[AnyRef](totalLen)
val allElems = new Array[AnyRef](totalLen)
var j = 0
var j = 0
arrayIts.foreach({
arrayIts.foreach({
it => {
it => {
Array.copy(it.elems, 0, allElems, j, it.len)
Array.copy(it.elems, 0, allElems, j, it.len)
j += it.len
j += it.len
}
}
})
})
new ArrayIterator(allElems, totalLen)
new ArrayIterator(allElems, totalLen)
}
}
}
}
}
}
}
}
}
}
Expansion: module object Iter2 extends {
Expansion: module object Iter2 extends {
<trait> trait Iterator[A] extends IterableOnce[A] {
<trait> trait Iterator[A] extends IterableOnce[A] {
def hasNext: Boolean
def hasNext: Boolean
def next: A
def next: A
def iterator = this
def iterator = this
def foreach(f: (A) => Unit): Unit = ???
def foreach(f: (A) => Unit): Unit = ???
def map[B](f: (A) => B): Iterator[B] = ???
def map[B](f: (A) => B): Iterator[B] = ???
def flatMap[B](f: (A) => IterableOnce[B]): Iterator[B] = ???
def flatMap[B](f: (A) => IterableOnce[B]): Iterator[B] = ???
def ++[B >: A](xs: IterableOnce[B]): Iterator[B] = ???
def ++[B >: A](xs: IterableOnce[B]): Iterator[B] = ???
def drop(n: Int): Iterator[A] = ???
def drop(n: Int): Iterator[A] = ???
def indexWhere(p: (A) => Boolean): Int = {
def indexWhere(p: (A) => Boolean): Int = {
var i = 0
var i = 0
while (hasNext) do {
while (hasNext) do {
if (p(next)) return i
if (p(next)) return i
i += 1
i += 1
}
}
-1
-1
}
}
def zip[B](that: Iterator[B]): Iterator[(A, B)] = ???
def zip[B](that: Iterator[B]): Iterator[(A, B)] = ???
}
}
<trait> trait IterableOnce[A] extends {
<trait> trait IterableOnce[A] extends {
def iterator: Iterator[A]
def iterator: Iterator[A]
def buildIterator: Iterator[A] = iterator
def buildIterator: Iterator[A] = iterator
}
}
<trait> trait FromIterator[C[X] <: Iterable[X]] extends {
<trait> trait FromIterator[C[X] <: Iterable[X]] extends {
def fromIterator[B](it: Iterator[B]): C[B]
def fromIterator[B](it: Iterator[B]): C[B]
}
}
<trait> trait Iterable[IA] extends IterableOnce[IA] with FromIterator[Iterable
<trait> trait Iterable[IA] extends IterableOnce[IA] with FromIterator[Iterable
]
]
{}
{}
<trait> trait Seq[AA] extends Iterable[AA] with FromIterator[Seq] {
<trait> trait Seq[AA] extends Iterable[AA] with FromIterator[Seq] {
def apply(i: Int): AA
def apply(i: Int): AA
def length: Int
def length: Int
}
}
<trait> sealed trait List[A] extends Seq[A] with FromIterator[List] {
<trait> sealed trait List[A] extends Seq[A] with FromIterator[List] {
def isEmpty: Boolean
def isEmpty: Boolean
def head: A
def head: A
def tail: List[A]
def tail: List[A]
def iterator = new ListIterator[A](this)
def iterator = new ListIterator[A](this)
def fromIterator[B](it: Iterator[B]): List[B] =
def fromIterator[B](it: Iterator[B]): List[B] =
it match {
it match {
case ListIterator(xs) =>
case ListIterator(xs) =>
xs
xs
case _ =>
case _ =>
if (it.hasNext) Cons(it.next, fromIterator(it)) else
if (it.hasNext) Cons(it.next, fromIterator(it)) else
Nil.asInstanceOf[List[B]]
Nil.asInstanceOf[List[B]]
}
}
def apply(i: Int): A = {
def apply(i: Int): A = {
require(! isEmpty)
require(! isEmpty)
if (i == 0) head else tail.apply(i - 1)
if (i == 0) head else tail.apply(i - 1)
}
}
def length: Int = if (isEmpty) 0 else 1 + tail.length
def length: Int = if (isEmpty) 0 else 1 + tail.length
}
}
case class Cons[A](val x: A, val xs: List[A]) extends List[A] {
case class Cons[A](val x: A, val xs: List[A]) extends List[A] {
def isEmpty = false
def isEmpty = false
def head = x
def head = x
def tail = xs
def tail = xs
}
}
module case object Nil extends List[Nothing] {
module case object Nil extends List[Nothing] {
def isEmpty = true
def isEmpty = true
def head = ???
def head = ???
def tail = ???
def tail = ???
}
}
class ArrayBuffer[A] private(private[this] val initElems: Array[AnyRef],
class ArrayBuffer[A] private(private[this] val initElems: Array[AnyRef],
private[this] val initLen: Int
private[this] val initLen: Int
) extends Seq[A] with FromIterator[ArrayBuffer] {
) extends Seq[A] with FromIterator[ArrayBuffer] {
def <init>() = {
def <init>() = {
<init>(new Array[AnyRef](16), 0)
<init>(new Array[AnyRef](16), 0)
()
()
}
}
def <init>(it: ArrayIterator[A]) = {
def <init>(it: ArrayIterator[A]) = {
<init>(it.elems, it.len)
<init>(it.elems, it.len)
()
()
}
}
private var elems: Array[AnyRef] = initElems
private var elems: Array[AnyRef] = initElems
private var len = 0
private var len = 0
def iterator = elems.iterator.take(len).asInstanceOf[Iterator[A]]
def iterator = elems.iterator.take(len).asInstanceOf[Iterator[A]]
override def buildIterator =
override def buildIterator =
new ArrayIterator(elems, len).asInstanceOf[Iterator[A]]
new ArrayIterator(elems, len).asInstanceOf[Iterator[A]]
def fromIterator[B](it: Iterator[B]): ArrayBuffer[B] =
def fromIterator[B](it: Iterator[B]): ArrayBuffer[B] =
new ArrayBuffer(ArrayIterator.fromIterator(it))
new ArrayBuffer(ArrayIterator.fromIterator(it))
def apply(i: Int) = elems(i).asInstanceOf[A]
def apply(i: Int) = elems(i).asInstanceOf[A]
def length = len
def length = len
}
}
implicit class IterableTransforms[A, C[X] <: Iterable[X]](
implicit class IterableTransforms[A, C[X] <: Iterable[X]](
val c: Iterable[A] & FromIterator[C]
val c: Iterable[A] & FromIterator[C]
) extends AnyVal {
) extends AnyVal {
def map[B](f: (A) => B): C[B] = c.fromIterator(c.buildIterator.map(f))
def map[B](f: (A) => B): C[B] = c.fromIterator(c.buildIterator.map(f))
def flatMap[B](f: (A) => IterableOnce[B]): C[B] =
def flatMap[B](f: (A) => IterableOnce[B]): C[B] =
c.fromIterator(c.buildIterator.flatMap(_$1 => f(_$1).buildIterator))
c.fromIterator(c.buildIterator.flatMap(_$1 => f(_$1).buildIterator))
def ++[B >: A](xs: IterableOnce[B]): C[B] =
def ++[B >: A](xs: IterableOnce[B]): C[B] =
c.fromIterator(c.buildIterator ++ xs.buildIterator)
c.fromIterator(c.buildIterator ++ xs.buildIterator)
def drop(n: Int): C[A] = c.fromIterator(c.buildIterator.drop(n))
def drop(n: Int): C[A] = c.fromIterator(c.buildIterator.drop(n))
def head: A = c.iterator.next
def head: A = c.iterator.next
def zip[B](xs: IterableOnce[B]): C[(A, B)] =
def zip[B](xs: IterableOnce[B]): C[(A, B)] =
c.fromIterator(c.iterator.zip(xs.iterator))
c.fromIterator(c.iterator.zip(xs.iterator))
}
}
implicit class SeqTransforms[SA, C[X] <: Seq[X]](
implicit class SeqTransforms[SA, C[X] <: Seq[X]](
val c: Seq[SA] & FromIterator[C]
val c: Seq[SA] & FromIterator[C]
) extends AnyVal {
) extends AnyVal {
def reverse: C[SA] = {
def reverse: C[SA] = {
val elems = new Array[AnyRef](c.length)
val elems = new Array[AnyRef](c.length)
var i = elems.length
var i = elems.length
val it = c.iterator
val it = c.iterator
while (it.hasNext) do {
while (it.hasNext) do {
i -= 1
i -= 1
elems(i) = it.next.asInstanceOf[AnyRef]
elems(i) = it.next.asInstanceOf[AnyRef]
}
}
val xzz = c.fromIterator(ArrayIterator[SA](elems, c.length))
val xzz = c.fromIterator(ArrayIterator[SA](elems, c.length))
xzz
xzz
}
}
def indexWhere(p: (SA) => Boolean): Int = c.iterator.indexWhere(p)
def indexWhere(p: (SA) => Boolean): Int = c.iterator.indexWhere(p)
}
}
case class ListIterator[A](val xs: List[A]) extends Iterator[A] {
case class ListIterator[A](val xs: List[A]) extends Iterator[A] {
private[this] var current: List[A] = xs
private[this] var current: List[A] = xs
def hasNext = ! current.isEmpty
def hasNext = ! current.isEmpty
def next = {
def next = {
val res = current.head
val res = current.head
current = current.tail
current = current.tail
res
res
}
}
}
}
case class ArrayIterator[A](val elems: Array[AnyRef], val len: Int) extends
case class ArrayIterator[A](val elems: Array[AnyRef], val len: Int) extends
Iterator
Iterator
[A] {
[A] {
import ArrayIterator._
import ArrayIterator._
private def elem(i: Int) = elems(i).asInstanceOf[A]
private def elem(i: Int) = elems(i).asInstanceOf[A]
private var cur = 0
private var cur = 0
def hasNext = cur < len
def hasNext = cur < len
def next = {
def next = {
val res = elem(cur)
val res = elem(cur)
cur += 1
cur += 1
res
res
}
}
override def foreach(f: (A) => Unit): Unit =
override def foreach(f: (A) => Unit): Unit =
for i <- 0 until len do f(elem(i))
for i <- 0 until len do f(elem(i))
override def map[B](f: (A) => B): ArrayIterator[B] = {
override def map[B](f: (A) => B): ArrayIterator[B] = {
var mapped = elems
var mapped = elems
for i <- 0 until len do {
for i <- 0 until len do {
val x = elem(i)
val x = elem(i)
val y = widen(f(x))
val y = widen(f(x))
if (widen(x) ne y) {
if (widen(x) ne y) {
if (mapped eq elems) mapped = new Array[AnyRef](len)
if (mapped eq elems) mapped = new Array[AnyRef](len)
mapped(i) = y
mapped(i) = y
}
}
}
}
if (mapped eq elems) this.asInstanceOf[ArrayIterator[B]] else
if (mapped eq elems) this.asInstanceOf[ArrayIterator[B]] else
new ArrayIterator(mapped, len)
new ArrayIterator(mapped, len)
}
}
override def flatMap[B](f: (A) => IterableOnce[B]): ArrayIterator[B] =
override def flatMap[B](f: (A) => IterableOnce[B]): ArrayIterator[B] =
flatten(map(_$2 => f(_$2).buildIterator))
flatten(map(_$2 => f(_$2).buildIterator))
override def ++[B >: A](that: IterableOnce[B]): ArrayIterator[B] = {
override def ++[B >: A](that: IterableOnce[B]): ArrayIterator[B] = {
val thatIterator @ ArrayIterator(elems2, len2) =
val thatIterator @ ArrayIterator(elems2, len2) =
fromIterator(that.iterator)
fromIterator(that.iterator)
if (len == 0) thatIterator else
if (len == 0) thatIterator else
if (len2 == 0) this.asInstanceOf[ArrayIterator[B]] else {
if (len2 == 0) this.asInstanceOf[ArrayIterator[B]] else {
val resLen = len + len2
val resLen = len + len2
val resElems = new Array[AnyRef](resLen)
val resElems = new Array[AnyRef](resLen)
Array.copy(elems, 0, resElems, 0, len)
Array.copy(elems, 0, resElems, 0, len)
Array.copy(elems2, 0, resElems, len, len2)
Array.copy(elems2, 0, resElems, len, len2)
new ArrayIterator(resElems, resLen)
new ArrayIterator(resElems, resLen)
}
}
}
}
}
}
module object ArrayIterator extends {
module object ArrayIterator extends {
private def widen(x: Any): AnyRef = x.asInstanceOf[AnyRef]
private def widen(x: Any): AnyRef = x.asInstanceOf[AnyRef]
def fromIterator[A](it: Iterator[A]): ArrayIterator[A] =
def fromIterator[A](it: Iterator[A]): ArrayIterator[A] =
it match {
it match {
case it: ArrayIterator[A] =>
case it: ArrayIterator[A] =>
it
it
case _ =>
case _ =>
var elems = new Array[AnyRef](32)
var elems = new Array[AnyRef](32)
var len = 0
var len = 0
def ensureCapacity() = {
def ensureCapacity() = {
while (len > elems.length) do {
while (len > elems.length) do {
val newElems = new Array[AnyRef](elems.length * 2)
val newElems = new Array[AnyRef](elems.length * 2)
Array.copy(elems, 0, newElems, 0, elems.length)
Array.copy(elems, 0, newElems, 0, elems.length)
elems = newElems
elems = newElems
}
}
}
}
while (it.hasNext) do {
while (it.hasNext) do {
len += 1
len += 1
ensureCapacity()
ensureCapacity()
elems(len - 1) = widen(it.next)
elems(len - 1) = widen(it.next)
}
}
ArrayIterator(elems, len)
ArrayIterator(elems, len)
}
}
def flatten[A](its: ArrayIterator[Iterator[A]]): ArrayIterator[A] = {
def flatten[A](its: ArrayIterator[Iterator[A]]): ArrayIterator[A] = {
var arrayIts = its.map(fromIterator)
var arrayIts = its.map(fromIterator)
var totalLen = 0
var totalLen = 0
arrayIts.foreach(_$3 => totalLen += _$3.len)
arrayIts.foreach(_$3 => totalLen += _$3.len)
val allElems = new Array[AnyRef](totalLen)
val allElems = new Array[AnyRef](totalLen)
var j = 0
var j = 0
arrayIts.foreach({
arrayIts.foreach({
it => {
it => {
Array.copy(it.elems, 0, allElems, j, it.len)
Array.copy(it.elems, 0, allElems, j, it.len)
j += it.len
j += it.len
}
}
})
})
new ArrayIterator(allElems, totalLen)
new ArrayIterator(allElems, totalLen)
}
}
}
}
} expands to Thicket {
} expands to Thicket {
final lazy module val Iter2: Iter2$ = new Iter2$()
final lazy module val Iter2: Iter2$ = new Iter2$()
final module class Iter2$() extends { this: Iter2.type =>
final module class Iter2$() extends { this: Iter2.type =>
<trait> trait Iterator[A] extends IterableOnce[A] {
<trait> trait Iterator[A] extends IterableOnce[A] {
def hasNext: Boolean
def hasNext: Boolean
def next: A
def next: A
def iterator = this
def iterator = this
def foreach(f: (A) => Unit): Unit = ???
def foreach(f: (A) => Unit): Unit = ???
def map[B](f: (A) => B): Iterator[B] = ???
def map[B](f: (A) => B): Iterator[B] = ???
def flatMap[B](f: (A) => IterableOnce[B]): Iterator[B] = ???
def flatMap[B](f: (A) => IterableOnce[B]): Iterator[B] = ???
def ++[B >: A](xs: IterableOnce[B]): Iterator[B] = ???
def ++[B >: A](xs: IterableOnce[B]): Iterator[B] = ???
def drop(n: Int): Iterator[A] = ???
def drop(n: Int): Iterator[A] = ???
def indexWhere(p: (A) => Boolean): Int = {
def indexWhere(p: (A) => Boolean): Int = {
var i = 0
var i = 0
while (hasNext) do {
while (hasNext) do {
if (p(next)) return i
if (p(next)) return i
i += 1
i += 1
}
}
-1
-1
}
}
def zip[B](that: Iterator[B]): Iterator[(A, B)] = ???
def zip[B](that: Iterator[B]): Iterator[(A, B)] = ???
}
}
<trait> trait IterableOnce[A] extends {
<trait> trait IterableOnce[A] extends {
def iterator: Iterator[A]
def iterator: Iterator[A]
def buildIterator: Iterator[A] = iterator
def buildIterator: Iterator[A] = iterator
}
}
<trait> trait FromIterator[C[X] <: Iterable[X]] extends {
<trait> trait FromIterator[C[X] <: Iterable[X]] extends {
def fromIterator[B](it: Iterator[B]): C[B]
def fromIterator[B](it: Iterator[B]): C[B]
}
}
<trait> trait Iterable[IA] extends IterableOnce[IA] with FromIterator[
<trait> trait Iterable[IA] extends IterableOnce[IA] with FromIterator[
Iterable
Iterable
] {}
] {}
<trait> trait Seq[AA] extends Iterable[AA] with FromIterator[Seq] {
<trait> trait Seq[AA] extends Iterable[AA] with FromIterator[Seq] {
def apply(i: Int): AA
def apply(i: Int): AA
def length: Int
def length: Int
}
}
<trait> sealed trait List[A] extends Seq[A] with FromIterator[List] {
<trait> sealed trait List[A] extends Seq[A] with FromIterator[List] {
def isEmpty: Boolean
def isEmpty: Boolean
def head: A
def head: A
def tail: List[A]
def tail: List[A]
def iterator = new ListIterator[A](this)
def iterator = new ListIterator[A](this)
def fromIterator[B](it: Iterator[B]): List[B] =
def fromIterator[B](it: Iterator[B]): List[B] =
it match {
it match {
case ListIterator(xs) =>
case ListIterator(xs) =>
xs
xs
case _ =>
case _ =>
if (it.hasNext) Cons(it.next, fromIterator(it)) else
if (it.hasNext) Cons(it.next, fromIterator(it)) else
Nil.asInstanceOf[List[B]]
Nil.asInstanceOf[List[B]]
}
}
def apply(i: Int): A = {
def apply(i: Int): A = {
require(! isEmpty)
require(! isEmpty)
if (i == 0) head else tail.apply(i - 1)
if (i == 0) head else tail.apply(i - 1)
}
}
def length: Int = if (isEmpty) 0 else 1 + tail.length
def length: Int = if (isEmpty) 0 else 1 + tail.length
}
}
case class Cons[A](val x: A, val xs: List[A]) extends List[A] {
case class Cons[A](val x: A, val xs: List[A]) extends List[A] {
def isEmpty = false
def isEmpty = false
def head = x
def head = x
def tail = xs
def tail = xs
}
}
module case object Nil extends List[Nothing] {
module case object Nil extends List[Nothing] {
def isEmpty = true
def isEmpty = true
def head = ???
def head = ???
def tail = ???
def tail = ???
}
}
class ArrayBuffer[A] private(private[this] val initElems: Array[AnyRef],
class ArrayBuffer[A] private(private[this] val initElems: Array[AnyRef],
private[this] val initLen: Int
private[this] val initLen: Int
) extends Seq[A] with FromIterator[ArrayBuffer] {
) extends Seq[A] with FromIterator[ArrayBuffer] {
def <init>() = {
def <init>() = {
<init>(new Array[AnyRef](16), 0)
<init>(new Array[AnyRef](16), 0)
()
()
}
}
def <init>(it: ArrayIterator[A]) = {
def <init>(it: ArrayIterator[A]) = {
<init>(it.elems, it.len)
<init>(it.elems, it.len)
()
()
}
}
private var elems: Array[AnyRef] = initElems
private var elems: Array[AnyRef] = initElems
private var len = 0
private var len = 0
def iterator = elems.iterator.take(len).asInstanceOf[Iterator[A]]
def iterator = elems.iterator.take(len).asInstanceOf[Iterator[A]]
override def buildIterator =
override def buildIterator =
new ArrayIterator(elems, len).asInstanceOf[Iterator[A]]
new ArrayIterator(elems, len).asInstanceOf[Iterator[A]]
def fromIterator[B](it: Iterator[B]): ArrayBuffer[B] =
def fromIterator[B](it: Iterator[B]): ArrayBuffer[B] =
new ArrayBuffer(ArrayIterator.fromIterator(it))
new ArrayBuffer(ArrayIterator.fromIterator(it))
def apply(i: Int) = elems(i).asInstanceOf[A]
def apply(i: Int) = elems(i).asInstanceOf[A]
def length = len
def length = len
}
}
implicit class IterableTransforms[A, C[X] <: Iterable[X]](
implicit class IterableTransforms[A, C[X] <: Iterable[X]](
val c: Iterable[A] & FromIterator[C]
val c: Iterable[A] & FromIterator[C]
) extends AnyVal {
) extends AnyVal {
def map[B](f: (A) => B): C[B] = c.fromIterator(c.buildIterator.map(f))
def map[B](f: (A) => B): C[B] = c.fromIterator(c.buildIterator.map(f))
def flatMap[B](f: (A) => IterableOnce[B]): C[B] =
def flatMap[B](f: (A) => IterableOnce[B]): C[B] =
c.fromIterator(c.buildIterator.flatMap(_$1 => f(_$1).buildIterator))
c.fromIterator(c.buildIterator.flatMap(_$1 => f(_$1).buildIterator))
def ++[B >: A](xs: IterableOnce[B]): C[B] =
def ++[B >: A](xs: IterableOnce[B]): C[B] =
c.fromIterator(c.buildIterator ++ xs.buildIterator)
c.fromIterator(c.buildIterator ++ xs.buildIterator)
def drop(n: Int): C[A] = c.fromIterator(c.buildIterator.drop(n))
def drop(n: Int): C[A] = c.fromIterator(c.buildIterator.drop(n))
def head: A = c.iterator.next
def head: A = c.iterator.next
def zip[B](xs: IterableOnce[B]): C[(A, B)] =
def zip[B](xs: IterableOnce[B]): C[(A, B)] =
c.fromIterator(c.iterator.zip(xs.iterator))
c.fromIterator(c.iterator.zip(xs.iterator))
}
}
implicit class SeqTransforms[SA, C[X] <: Seq[X]](
implicit class SeqTransforms[SA, C[X] <: Seq[X]](
val c: Seq[SA] & FromIterator[C]
val c: Seq[SA] & FromIterator[C]
) extends AnyVal {
) extends AnyVal {
def reverse: C[SA] = {
def reverse: C[SA] = {
val elems = new Array[AnyRef](c.length)
val elems = new Array[AnyRef](c.length)
var i = elems.length
var i = elems.length
val it = c.iterator
val it = c.iterator
while (it.hasNext) do {
while (it.hasNext) do {
i -= 1
i -= 1
elems(i) = it.next.asInstanceOf[AnyRef]
elems(i) = it.next.asInstanceOf[AnyRef]
}
}
val xzz = c.fromIterator(ArrayIterator[SA](elems, c.length))
val xzz = c.fromIterator(ArrayIterator[SA](elems, c.length))
xzz
xzz
}
}
def indexWhere(p: (SA) => Boolean): Int = c.iterator.indexWhere(p)
def indexWhere(p: (SA) => Boolean): Int = c.iterator.indexWhere(p)
}
}
case class ListIterator[A](val xs: List[A]) extends Iterator[A] {
case class ListIterator[A](val xs: List[A]) extends Iterator[A] {
private[this] var current: List[A] = xs
private[this] var current: List[A] = xs
def hasNext = ! current.isEmpty
def hasNext = ! current.isEmpty
def next = {
def next = {
val res = current.head
val res = current.head
current = current.tail
current = current.tail
res
res
}
}
}
}
case class ArrayIterator[A](val elems: Array[AnyRef], val len: Int) extends
case class ArrayIterator[A](val elems: Array[AnyRef], val len: Int) extends
Iterator
Iterator
[A] {
[A] {
import ArrayIterator._
import ArrayIterator._
private def elem(i: Int) = elems(i).asInstanceOf[A]
private def elem(i: Int) = elems(i).asInstanceOf[A]
private var cur = 0
private var cur = 0
def hasNext = cur < len
def hasNext = cur < len
def next = {
def next = {
val res = elem(cur)
val res = elem(cur)
cur += 1
cur += 1
res
res
}
}
override def foreach(f: (A) => Unit): Unit =
override def foreach(f: (A) => Unit): Unit =
for i <- 0 until len do f(elem(i))
for i <- 0 until len do f(elem(i))
override def map[B](f: (A) => B): ArrayIterator[B] = {
override def map[B](f: (A) => B): ArrayIterator[B] = {
var mapped = elems
var mapped = elems
for i <- 0 until len do {
for i <- 0 until len do {
val x = elem(i)
val x = elem(i)
val y = widen(f(x))
val y = widen(f(x))
if (widen(x) ne y) {
if (widen(x) ne y) {
if (mapped eq elems) mapped = new Array[AnyRef](len)
if (mapped eq elems) mapped = new Array[AnyRef](len)
mapped(i) = y
mapped(i) = y
}
}
}
}
if (mapped eq elems) this.asInstanceOf[ArrayIterator[B]] else
if (mapped eq elems) this.asInstanceOf[ArrayIterator[B]] else
new ArrayIterator(mapped, len)
new ArrayIterator(mapped, len)
}
}
override def flatMap[B](f: (A) => IterableOnce[B]): ArrayIterator[B] =
override def flatMap[B](f: (A) => IterableOnce[B]): ArrayIterator[B] =
flatten(map(_$2 => f(_$2).buildIterator))
flatten(map(_$2 => f(_$2).buildIterator))
override def ++[B >: A](that: IterableOnce[B]): ArrayIterator[B] = {
override def ++[B >: A](that: IterableOnce[B]): ArrayIterator[B] = {
val thatIterator @ ArrayIterator(elems2, len2) =
val thatIterator @ ArrayIterator(elems2, len2) =
fromIterator(that.iterator)
fromIterator(that.iterator)
if (len == 0) thatIterator else
if (len == 0) thatIterator else
if (len2 == 0) this.asInstanceOf[ArrayIterator[B]] else {
if (len2 == 0) this.asInstanceOf[ArrayIterator[B]] else {
val resLen = len + len2
val resLen = len + len2
val resElems = new Array[AnyRef](resLen)
val resElems = new Array[AnyRef](resLen)
Array.copy(elems, 0, resElems, 0, len)
Array.copy(elems, 0, resElems, 0, len)
Array.copy(elems2, 0, resElems, len, len2)
Array.copy(elems2, 0, resElems, len, len2)
new ArrayIterator(resElems, resLen)
new ArrayIterator(resElems, resLen)
}
}
}
}
}
}
module object ArrayIterator extends {
module object ArrayIterator extends {
private def widen(x: Any): AnyRef = x.asInstanceOf[AnyRef]
private def widen(x: Any): AnyRef = x.asInstanceOf[AnyRef]
def fromIterator[A](it: Iterator[A]): ArrayIterator[A] =
def fromIterator[A](it: Iterator[A]): ArrayIterator[A] =
it match {
it match {
case it: ArrayIterator[A] =>
case it: ArrayIterator[A] =>
it
it
case _ =>
case _ =>
var elems = new Array[AnyRef](32)
var elems = new Array[AnyRef](32)
var len = 0
var len = 0
def ensureCapacity() = {
def ensureCapacity() = {
while (len > elems.length) do {
while (len > elems.length) do {
val newElems = new Array[AnyRef](elems.length * 2)
val newElems = new Array[AnyRef](elems.length * 2)
Array.copy(elems, 0, newElems, 0, elems.length)
Array.copy(elems, 0, newElems, 0, elems.length)
elems = newElems
elems = newElems
}
}
}
}
while (it.hasNext) do {
while (it.hasNext) do {
len += 1
len += 1
ensureCapacity()
ensureCapacity()
elems(len - 1) = widen(it.next)
elems(len - 1) = widen(it.next)
}
}
ArrayIterator(elems, len)
ArrayIterator(elems, len)
}
}
def flatten[A](its: ArrayIterator[Iterator[A]]): ArrayIterator[A] = {
def flatten[A](its: ArrayIterator[Iterator[A]]): ArrayIterator[A] = {
var arrayIts = its.map(fromIterator)
var arrayIts = its.map(fromIterator)
var totalLen = 0
var totalLen = 0
arrayIts.foreach(_$3 => totalLen += _$3.len)
arrayIts.foreach(_$3 => totalLen += _$3.len)
val allElems = new Array[AnyRef](totalLen)
val allElems = new Array[AnyRef](totalLen)
var j = 0
var j = 0
arrayIts.foreach({
arrayIts.foreach({
it => {
it => {
Array.copy(it.elems, 0, allElems, j, it.len)
Array.copy(it.elems, 0, allElems, j, it.len)
j += it.len
j += it.len
}
}
})
})
new ArrayIterator(allElems, totalLen)
new ArrayIterator(allElems, totalLen)
}
}
}
}
}
}
}
}
creating symbol for import annotation.unchecked.uncheckedVariance in Mode(ImplicitsEnabled)
creating symbol for import annotation.unchecked.uncheckedVariance in Mode(ImplicitsEnabled)
creating symbol for final lazy module val Iter2: Iter2$ = new Iter2$() in Mode(ImplicitsEnabled)
creating symbol for final lazy module val Iter2: Iter2$ = new Iter2$() in Mode(ImplicitsEnabled)
entered: module Iter2 in module class immutable and Scopes(class Iter2$ArrayBuffer, module Iter2$ArrayBuffer, module class Iter2$ArrayBuffer$, class Iter2$ArrayIterator, module Iter2$ArrayIterator, module class Iter2$ArrayIterator$, class Iter2$Cons, module Iter2$Cons, module class Iter2$Cons$, class Iter2$FromIterator, module Iter2$FromIterator, module class Iter2$FromIterator$, class Iter2$Iterable, module Iter2$Iterable, module class Iter2$Iterable$, class Iter2$IterableOnce, module Iter2$IterableOnce, module class Iter2$IterableOnce$, class Iter2$IterableTransforms, module Iter2$IterableTransforms, module class Iter2$IterableTransforms$, class Iter2$Iterator, module Iter2$Iterator, module class Iter2$Iterator$, class Iter2$List, module Iter2$List, module class Iter2$List$, class Iter2$ListIterator, module Iter2$ListIterator, module class Iter2$ListIterator$, class Iter2$Nil, module Iter2$Nil, module class Iter2$Nil$, class Iter2$Seq, module Iter2$Seq, module class Iter2$Seq$, class Iter2$SeqTransforms, module Iter2$SeqTransforms, module class Iter2$SeqTransforms$, class Iter2$View, module Iter2$View, module class Iter2$View$, class Iter2, module Iter2, module class Iter2$)
entered: module Iter2 in module class immutable and Scopes(class Iter2$ArrayBuffer, module Iter2$ArrayBuffer, module class Iter2$ArrayBuffer$, class Iter2$ArrayIterator, module Iter2$ArrayIterator, module class Iter2$ArrayIterator$, class Iter2$Cons, module Iter2$Cons, module class Iter2$Cons$, class Iter2$FromIterator, module Iter2$FromIterator, module class Iter2$FromIterator$, class Iter2$Iterable, module Iter2$Iterable, module class Iter2$Iterable$, class Iter2$IterableOnce, module Iter2$IterableOnce, module class Iter2$IterableOnce$, class Iter2$IterableTransforms, module Iter2$IterableTransforms, module class Iter2$IterableTransforms$, class Iter2$Iterator, module Iter2$Iterator, module class Iter2$Iterator$, class Iter2$List, module Iter2$List, module class Iter2$List$, class Iter2$ListIterator, module Iter2$ListIterator, module class Iter2$ListIterator$, class Iter2$Nil, module Iter2$Nil, module class Iter2$Nil$, class Iter2$Seq, module Iter2$Seq, module class Iter2$Seq$, class Iter2$SeqTransforms, module Iter2$SeqTransforms, module class Iter2$SeqTransforms$, class Iter2$View, module Iter2$View, module class Iter2$View$, class Iter2, module Iter2, module class Iter2$)
creating symbol for final module class Iter2$() extends { this: Iter2.type =>
creating symbol for final module class Iter2$() extends { this: Iter2.type =>
<trait> trait Iterator[A] extends IterableOnce[A] {
<trait> trait Iterator[A] extends IterableOnce[A] {
def hasNext: Boolean
def hasNext: Boolean
def next: A
def next: A
def iterator = this
def iterator = this
def foreach(f: (A) => Unit): Unit = ???
def foreach(f: (A) => Unit): Unit = ???
def map[B](f: (A) => B): Iterator[B] = ???
def map[B](f: (A) => B): Iterator[B] = ???
def flatMap[B](f: (A) => IterableOnce[B]): Iterator[B] = ???
def flatMap[B](f: (A) => IterableOnce[B]): Iterator[B] = ???
def ++[B >: A](xs: IterableOnce[B]): Iterator[B] = ???
def ++[B >: A](xs: IterableOnce[B]): Iterator[B] = ???
def drop(n: Int): Iterator[A] = ???
def drop(n: Int): Iterator[A] = ???
def indexWhere(p: (A) => Boolean): Int = {
def indexWhere(p: (A) => Boolean): Int = {
var i = 0
var i = 0
while (hasNext) do {
while (hasNext) do {
if (p(next)) return i
if (p(next)) return i
i += 1
i += 1
}
}
-1
-1
}
}
def zip[B](that: Iterator[B]): Iterator[(A, B)] = ???
def zip[B](that: Iterator[B]): Iterator[(A, B)] = ???
}
}
<trait> trait IterableOnce[A] extends {
<trait> trait IterableOnce[A] extends {
def iterator: Iterator[A]
def iterator: Iterator[A]
def buildIterator: Iterator[A] = iterator
def buildIterator: Iterator[A] = iterator
}
}
<trait> trait FromIterator[C[X] <: Iterable[X]] extends {
<trait> trait FromIterator[C[X] <: Iterable[X]] extends {
def fromIterator[B](it: Iterator[B]): C[B]
def fromIterator[B](it: Iterator[B]): C[B]
}
}
<trait> trait Iterable[IA] extends IterableOnce[IA] with FromIterator[Iterable
<trait> trait Iterable[IA] extends IterableOnce[IA] with FromIterator[Iterable
]
]
{}
{}
<trait> trait Seq[AA] extends Iterable[AA] with FromIterator[Seq] {
<trait> trait Seq[AA] extends Iterable[AA] with FromIterator[Seq] {
def apply(i: Int): AA
def apply(i: Int): AA
def length: Int
def length: Int
}
}
<trait> sealed trait List[A] extends Seq[A] with FromIterator[List] {
<trait> sealed trait List[A] extends Seq[A] with FromIterator[List] {
def isEmpty: Boolean
def isEmpty: Boolean
def head: A
def head: A
def tail: List[A]
def tail: List[A]
def iterator = new ListIterator[A](this)
def iterator = new ListIterator[A](this)
def fromIterator[B](it: Iterator[B]): List[B] =
def fromIterator[B](it: Iterator[B]): List[B] =
it match {
it match {
case ListIterator(xs) =>
case ListIterator(xs) =>
xs
xs
case _ =>
case _ =>
if (it.hasNext) Cons(it.next, fromIterator(it)) else
if (it.hasNext) Cons(it.next, fromIterator(it)) else
Nil.asInstanceOf[List[B]]
Nil.asInstanceOf[List[B]]
}
}
def apply(i: Int): A = {
def apply(i: Int): A = {
require(! isEmpty)
require(! isEmpty)
if (i == 0) head else tail.apply(i - 1)
if (i == 0) head else tail.apply(i - 1)
}
}
def length: Int = if (isEmpty) 0 else 1 + tail.length
def length: Int = if (isEmpty) 0 else 1 + tail.length
}
}
case class Cons[A](val x: A, val xs: List[A]) extends List[A] {
case class Cons[A](val x: A, val xs: List[A]) extends List[A] {
def isEmpty = false
def isEmpty = false
def head = x
def head = x
def tail = xs
def tail = xs
}
}
module case object Nil extends List[Nothing] {
module case object Nil extends List[Nothing] {
def isEmpty = true
def isEmpty = true
def head = ???
def head = ???
def tail = ???
def tail = ???
}
}
class ArrayBuffer[A] private(private[this] val initEle
class ArrayBuffer[A] private(private[this] val initElems: Array[AnyRef],
private[this] val initLen: Int
) extends S