package scala.collection import generic._
import mutable.{ Builder, ListBuffer } import annotation.{tailrec, migration, bridge} import annotation.unchecked.{ uncheckedVariance => uV } import parallel.ParIterable
trait TraversableLike[+A, +Repr] extends HasNewBuilder[A, Repr] with FilterMonadic[A, Repr] with TraversableOnce[A] with GenTraversableLike[A,
Repr] with Parallelizable[A, ParIterable[A]] { self => import Traversable.breaks._ protected type Self = Repr
def repr: Repr = this.asInstanceOf[Repr]
protected[this] def thisCollection: Traversable[A] = this.asInstanceOf[Traversable[A]]
protected[this] def toCollection(repr: Repr): Traversable[A] = repr.asInstanceOf[Traversable[A]] protected[this] def newBuilder: Builder[A,
Repr] protected[this] def parCombiner = ParIterable.newCombiner[A]
def foreach[U](f: A => U): Unit
def isEmpty: Boolean = { var result = true breakable { for (x
<- this) { result=f alse break } } result }
def hasDefiniteSize=t rue def ++[B>: A, That](that: GenTraversableOnce[B])(implicit bf: CanBuildFrom[Repr, B, That]): That = { val b = bf(repr) if (that.isInstanceOf[IndexedSeqLike[_, _]]) b.sizeHint(this, that.seq.size) b ++= thisCollection b ++= that.seq b.result } @bridge
def ++[B >: A, That](that: TraversableOnce[B])(implicit bf: CanBuildFrom[Repr, B, That]): That = ++(that: GenTraversableOnce[B])(bf)
def ++:[B >: A, That](that: TraversableOnce[B])(implicit bf: CanBuildFrom[Repr, B, That]): That = { val b = bf(repr) if (that.isInstanceOf[IndexedSeqLike[_, _]]) b.sizeHint(this, that.size)
b ++= that b ++= thisCollection b.result }
def ++:[B >: A, That](that: Traversable[B])(implicit bf: CanBuildFrom[Repr, B, That]): That = (that ++ seq)(breakOut) def map[B, That](f: A
=> B)(implicit bf: CanBuildFrom[Repr, B, That]): That = { val b = bf(repr) b.sizeHint(this) for (x
<- this) b +=f (x) b.result } def flatMap[B, That](f: A=> GenTraversableOnce[B])(implicit bf: CanBuildFrom[Repr, B, That]): That = { val b = bf(repr) for (x
<- this) b ++=f (x).seq b.result }
def filter(p: A=> Boolean): Repr = { val b = newBuilder for (x
<- this) if (p(x)) b +=x b.result }
def filterNot(p: A=> Boolean): Repr = filter(!p(_)) def collect[B, That](pf: PartialFunction[A, B])(implicit bf: CanBuildFrom[Repr, B, That]): That = { val b = bf(repr) for (x
<- this) if (pf.isDefinedAt(x)) b +=p f(x) b.result }
=> Boolean): (Repr, Repr) = { val l, r = newBuilder for (x
<- this) (if (p(x)) l else r) +=x (l.result, r.result) } def groupBy[K](f: A=> K): immutable.Map[K, Repr] = { val m = mutable.Map.empty[K, Builder[A, Repr]] for (elem
<- this) { val key=f (elem) val bldr=m .getOrElseUpdate(key, newBuilder) bldr +=e lem } val b=i mmutable.Map.newBuilder[K, Repr]
for ((k, v) <- m) b +=( (k, v.result)) b.result }
def forall(p: A=> Boolean): Boolean = { var result = true breakable { for (x
<- this) if (!p(x)) { result=f alse; break } } result }
def exists(p: A=> Boolean): Boolean = { var result = false breakable { for (x
<- this) if (p(x)) { result=t rue; break } } result }
Boolean): Option[A] = { var result: Option[A] = None breakable { for (x
<- this) if (p(x)) { result=S ome(x); break } } result } def scan[B>: A, That](z: B)(op: (B, B) => B)(implicit cbf: CanBuildFrom[Repr, B, That]): That = scanLeft(z)(op) def scanLeft[B, That](z: B)(op: (B, A) => B)(implicit bf: CanBuildFrom[Repr, B, That]): That = { val
b = bf(repr) b.sizeHint(this, 1) var acc = z b += acc for (x
<- this) { acc=o p(acc, x); b +=a cc } b.result } @migration(2, 9, "This scanRight definition has changed in 2.9.\n" +
"The previous behavior can be reproduced with scanRight.reverse." ) def scanRight[B, That](z: B)(op: (A, B)=> B)(implicit bf: CanBuildFrom[Repr, B, That]): That = { var scanned = List(z) var acc = z for (x
<- reversed) { acc=o p(x, acc) scanned ::=a cc } val b=b f(repr) for (elem <- scanned) b +=e lem b.result
} def head: A={ var result:
()=> A = () => throw new NoSuchElementException breakable { for (x
<- this) { result=( )=> x break } } result() } def headOption: Option[A]
= if (isEmpty) None else Some(head)
override def tail: Repr = { if (isEmpty) throw new UnsupportedOperationException("empty.tail") drop(1) }
def last: A = { var lst = head for (x
} def lastOption: Option[A]=i f (isEmpty)
def init: Repr={ if (isEmpty) throw new UnsupportedOperationException( "empty.init") var lst=h ead var follow=f alse val b=n ewBuilder b.sizeHint(this, -1) for
(x <- this.seq) { if (follow) b +=l st else follow=t rue lst=x } b.result } def take(n: Int): Repr=s lice(0, n) def drop(n: Int): Repr=i f (n <=0 ) { val b=n ewBuilder b.sizeHint(this)
b ++=t hisCollection result } else sliceWithKnownDelta(n, Int.MaxValue, -n) def slice(from: Int, until: Int): Repr=s liceWithKnownBound(math.max(from, 0), until)
{ if (i>= from) b += x i += 1 if (i >= until) break } } b.result }
<=f rom) b.result else { b.sizeHint(this, delta) sliceInternal(from, until, b) } }
<=f rom) b.result else { b.sizeHintBounded(until - from, this) sliceInternal(from,
until, b) } } def takeWhile(p: A=> Boolean): Repr = { val b = newBuilder breakable { for (x
<- this) { if (!p(x)) break b +=x } } b.result } def dropWhile(p: A=> Boolean): Repr = { val b = newBuilder var go = false for (x
<- this) { if (!p(x)) go=t rue if (go) b +=x } b.result } def span(p: A=> Boolean): (Repr, Repr) = { val l, r = newBuilder var toLeft = true for (x
<- this) { toLeft=t oLeft && p(x) (if (toLeft) l else r) +=x } (l.result, r.result) } def
splitAt(n: Int): (Repr, Repr)={ val l, r=n ewBuilder l.sizeHintBounded(n, this) if (n>= 0) r.sizeHint(this, -n) var i = 0 for (x
<- this) { (if (i < n) l else r) +=x i +=1 } (l.result, r.result) }
def tails: Iterator[Repr]=i
def inits: Iterator[Repr]=i terateUntilEmpty(_.init)
def copyToArray[B>: A](xs: Array[B], start: Int, len: Int) { var i = start val end = (start + len) min xs.length breakable { for (x
<- this) { if (i>= end) break xs(i) = x i += 1 } } } def toTraversable: Traversable[A] = thisCollection def toIterator: Iterator[A] = toStream.iterator def toStream: Stream[A]
override def toString = mkString(stringPrefix
def stringPrefix : String =
{ var string = repr.asInstanceOf[AnyRef].getClass.getName val idx1 = string.lastIndexOf('.' : Int) if (idx1 != -1) string = string.substring(idx1 +
1) val idx2 = string.indexOf('$') if (idx2 != -1) string = string.substring(0, idx2) string }
def view = new TraversableView[A, Repr] { protected lazy val underlying = self.repr override def foreach[U](f:
A => U) = self foreach f }
def view(from: Int, until: Int):
TraversableView[A, Repr] = view.slice(from, until)
def withFilter(p: A => Boolean): FilterMonadic[A, Repr] = new WithFilter(p)
class WithFilter(p: A => Boolean) extends FilterMonadic[A, Repr] {
def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That
= { val b = bf(repr) for (x
<- self) if (p(x)) b +=f (x) b.result }
def flatMap[B, That](f: A => GenTraversableOnce[B])(implicit bf: CanBuildFrom[Repr,
B, That]): That = { val b = bf(repr) for (x
<- self) if (p(x)) b ++=f (x).seq b.result }
def foreach[U](f: A => U): Unit = for (x
def withFilter(q: A=> Boolean): WithFilter = new WithFilter(x => p(x) && q(x)) }
@uV] => Traversable[A @uV]): Iterator[Repr] = { val it = Iterator.iterate(thisCollection)(f) takeWhile (x => !x.isEmpty) it ++ Iterator(Nil)
map (newBuilder ++= _ result) } }