package scala.collection
import generic._
import immutable.{ List, Stream }
import annotation.unchecked.uncheckedVariance
import annotation.bridge
trait IterableLike[+A, +Repr] extends Equals with TraversableLike[A, Repr] with GenIterableLike[A, Repr] {
self =>
override protected[this] def thisCollection: Iterable[A] = this.asInstanceOf[Iterable[A]]
override protected[this] def toCollection(repr: Repr): Iterable[A] = repr.asInstanceOf[Iterable[A]]
def iterator: Iterator[A]
def foreach[U](f: A => U): Unit =
iterator.foreach(f)
override def forall(p: A => Boolean): Boolean =
iterator.forall(p)
override def exists(p: A => Boolean): Boolean =
iterator.exists(p)
override def find(p: A => Boolean): Option[A] =
iterator.find(p)
override def isEmpty: Boolean =
!iterator.hasNext
override def foldRight[B](z: B)(op: (A, B) => B): B =
iterator.foldRight(z)(op)
override def reduceRight[B >: A](op: (A, B) => B): B =
iterator.reduceRight(op)
override def toIterable: Iterable[A] =
thisCollection
override def head: A =
iterator.next
override def slice(from: Int, until: Int): Repr = {
val lo = math.max(from, 0)
val elems = until - lo
val b = newBuilder
if (elems <= 0) b.result
else {
b.sizeHintBounded(elems, this)
var i = 0
val it = iterator drop lo
while (i < elems && it.hasNext) {
b += it.next
i += 1
}
b.result
}
}
override def take(n: Int): Repr = {
val b = newBuilder
if (n <= 0) b.result
else {
b.sizeHintBounded(n, this)
var i = 0
val it = iterator
while (i < n && it.hasNext) {
b += it.next
i += 1
}
b.result
}
}
override def drop(n: Int): Repr = {
val b = newBuilder
val lo = math.max(0, n)
b.sizeHint(this, -lo)
var i = 0
val it = iterator
while (i < n && it.hasNext) {
it.next
i += 1
}
b ++= it result
}
override def takeWhile(p: A => Boolean): Repr = {
val b = newBuilder
val it = iterator
while (it.hasNext) {
val x = it.next
if (!p(x)) return b.result
b += x
}
b.result
}
def grouped(size: Int): Iterator[Repr] =
for (xs <- iterator grouped size) yield {
val b = newBuilder
b ++= xs
b.result
}
def sliding[B >: A](size: Int): Iterator[Repr] = sliding(size, 1)
def sliding[B >: A](size: Int, step: Int): Iterator[Repr] =
for (xs <- iterator.sliding(size, step)) yield {
val b = newBuilder
b ++= xs
b.result
}
def takeRight(n: Int): Repr = {
val b = newBuilder
b.sizeHintBounded(n, this)
val lead = this.iterator drop n
var go = false
for (x <- this.seq) {
if (lead.hasNext) lead.next
else go = true
if (go) b += x
}
b.result
}
def dropRight(n: Int): Repr = {
val b = newBuilder
if (n >= 0) b.sizeHint(this, -n)
val lead = iterator drop n
val it = iterator
while (lead.hasNext) {
b += it.next
lead.next
}
b.result
}
override def copyToArray[B >: A](xs: Array[B], start: Int, len: Int) {
var i = start
val end = (start + len) min xs.length
val it = iterator
while (i < end && it.hasNext) {
xs(i) = it.next
i += 1
}
}
def zip[A1 >: A, B, That](that: GenIterable[B])(implicit bf: CanBuildFrom[Repr, (A1, B), That]): That = {
val b = bf(repr)
val these = this.iterator
val those = that.iterator
while (these.hasNext && those.hasNext)
b += ((these.next, those.next))
b.result
}
@bridge
def zip[A1 >: A, B, That](that: Iterable[B])(implicit bf: CanBuildFrom[Repr, (A1, B), That]): That =
zip(that: GenIterable[B])(bf)
def zipAll[B, A1 >: A, That](that: GenIterable[B], thisElem: A1, thatElem: B)(implicit bf: CanBuildFrom[Repr, (A1, B), That]): That = {
val b = bf(repr)
val these = this.iterator
val those = that.iterator
while (these.hasNext && those.hasNext)
b += ((these.next, those.next))
while (these.hasNext)
b += ((these.next, thatElem))
while (those.hasNext)
b += ((thisElem, those.next))
b.result
}
@bridge
def zipAll[B, A1 >: A, That](that: Iterable[B], thisElem: A1, thatElem: B)(implicit bf: CanBuildFrom[Repr, (A1, B), That]): That =
zipAll(that: GenIterable[B], thisElem, thatElem)(bf)
def zipWithIndex[A1 >: A, That](implicit bf: CanBuildFrom[Repr, (A1, Int), That]): That = {
val b = bf(repr)
var i = 0
for (x <- this) {
b += ((x, i))
i +=1
}
b.result
}
def sameElements[B >: A](that: GenIterable[B]): Boolean = {
val these = this.iterator
val those = that.iterator
while (these.hasNext && those.hasNext)
if (these.next != those.next)
return false
!these.hasNext && !those.hasNext
}
@bridge
def sameElements[B >: A](that: Iterable[B]): Boolean = sameElements(that: GenIterable[B])
override def toStream: Stream[A] = iterator.toStream
override def canEqual(that: Any) = true
override def view = new IterableView[A, Repr] {
protected lazy val underlying = self.repr
override def iterator = self.iterator
}
override def view(from: Int, until: Int) = view.slice(from, until)
@deprecated("use `iterator' instead", "2.8.0")
def elements = iterator
@deprecated("use `head' instead", "2.8.0") def first: A = head
@deprecated("use `headOption' instead", "2.8.0") def firstOption: Option[A] = headOption
@deprecated("use `view' instead", "2.8.0")
def projection = view
}