summaryrefslogtreecommitdiff
path: root/src/library
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2009-12-07 17:31:49 +0000
committerMartin Odersky <odersky@gmail.com>2009-12-07 17:31:49 +0000
commit1e88594f358d08b5e9b22ba87280003a581359e4 (patch)
treee68b6d1095ff1b1345e86d8a67c1f874849a31ff /src/library
parentde1d172a15e20ec7e96d96d5cea5cb41162b9f75 (diff)
downloadscala-1e88594f358d08b5e9b22ba87280003a581359e4.tar.gz
scala-1e88594f358d08b5e9b22ba87280003a581359e4.tar.bz2
scala-1e88594f358d08b5e9b22ba87280003a581359e4.zip
new doc comment generation, including some new ...
new doc comment generation, including some new style doc comments in collection classes.
Diffstat (limited to 'src/library')
-rw-r--r--src/library/scala/collection/IndexedSeqLike.scala13
-rw-r--r--src/library/scala/collection/IterableLike.scala333
-rw-r--r--src/library/scala/collection/Iterator.scala15
-rw-r--r--src/library/scala/collection/LinearSeqLike.scala12
-rw-r--r--src/library/scala/collection/MapLike.scala40
-rw-r--r--src/library/scala/collection/SeqLike.scala325
-rw-r--r--src/library/scala/collection/TraversableLike.scala150
-rw-r--r--src/library/scala/collection/mutable/MapLike.scala9
8 files changed, 560 insertions, 337 deletions
diff --git a/src/library/scala/collection/IndexedSeqLike.scala b/src/library/scala/collection/IndexedSeqLike.scala
index 68862e4aed..7041078229 100644
--- a/src/library/scala/collection/IndexedSeqLike.scala
+++ b/src/library/scala/collection/IndexedSeqLike.scala
@@ -77,7 +77,18 @@ trait IndexedSeqLike[+A, +Repr] extends SeqLike[A, Repr] { self =>
val i = prefixLength(!p(_))
if (i < length) Some(this(i)) else None
}
-
+/*
+ override def mapFind[B](f: A => Option[B]): Option[B] = {
+ var i = 0
+ var res: Option[B] = None
+ val len = length
+ while (res.isEmpty && i < len) {
+ res = f(this(i))
+ i += 1
+ }
+ res
+ }
+*/
@tailrec
private def foldl[B](start: Int, end: Int, z: B, op: (B, A) => B): B =
if (start == end) z
diff --git a/src/library/scala/collection/IterableLike.scala b/src/library/scala/collection/IterableLike.scala
index f1401f1221..66f63dd2f5 100644
--- a/src/library/scala/collection/IterableLike.scala
+++ b/src/library/scala/collection/IterableLike.scala
@@ -14,7 +14,7 @@ import immutable.{List, Stream}
import annotation.unchecked.uncheckedVariance
/** <p>
- * A template trait for iterable collections.
+ * A template trait for iterable collections of type `Iterable[A]`.
* </p>
* <p>
* Collection classes mixing in this trait provide a method
@@ -36,11 +36,27 @@ import annotation.unchecked.uncheckedVariance
* <code>Iterable</code></a>.
* </p>
*
- * @note This trait replaces every method that uses breaks in the original by an iterator version.
+ * Note: This trait replaces every method that uses breaks in the original by an iterator version.
+ *
+ * @see Iterable
*
* @author Martin Odersky
* @version 2.8
* @since 2.8
+ *
+ * @tparam A the element type of the collection
+ * @tparam Repr the type of the actual collection containing the elements.
+ *
+ * @define Coll Iterable
+ * @define coll iterable collection
+ * @define zipthatinfo the class of the returned collection. Where possible, `That` is
+ * the same class as the current collection class `Repr`, but this
+ * depends on the element type `(A1, B)` being admissible for that class,
+ * which means that an implicit instance of type `CanBuildFrom[Repr, (A1, B), That]`.
+ * is found.
+ * @define zipbfinfo an implicit value of class `CanBuildFrom` which determines the
+ * result class `That` from the current representation type `Repr`
+ * and the new element type `(A1, B)`.
*/
trait IterableLike[+A, +Repr] extends Equals with TraversableLike[A, Repr] {
self =>
@@ -58,102 +74,50 @@ self =>
@deprecated("use `iterator' instead")
def elements = iterator
- /** Apply a function <code>f</code> to all elements of this
- * iterable object.
- *
- * @param f A function that is applied for its side-effect to every element.
- * The result (of arbitrary type U) of function `f` is discarded.
- *
- * @note This method underlies the implementation of most other bulk operations.
- * Implementing `foreach` with `iterator` is often suboptimal.
- * So `foreach` should be overridden in concrete collection classes if a more
- * efficient implementation is available.
- */
- def foreach[U](f: A => U): Unit = iterator.foreach(f)
-
-
- /** Return true iff the given predicate `p` yields true for all elements
- * of this iterable.
- *
- * @note May not terminate for infinite-sized collections.
- * @param p the predicate
- */
- override def forall(p: A => Boolean): Boolean = iterator.forall(p)
-
- /** Return true iff there is an element in this iterable for which the
- * given predicate `p` yields true.
- *
- * @note May not terminate for infinite-sized collections.
- * @param p the predicate
- */
- override def exists(p: A => Boolean): Boolean = iterator.exists(p)
-
- /** Find and return the first element of the iterable object satisfying a
- * predicate, if any.
+ /** Applies a function `f` to all elements of this $coll.
*
- * @note may not terminate for infinite-sized collections.
- * @note Might return different results for different runs, unless this iterable is ordered.
- * @param p the predicate
- * @return an option containing the first element in the iterable object
- * satisfying <code>p</code>, or <code>None</code> if none exists.
- */
- override def find(p: A => Boolean): Option[A] = iterator.find(p)
-
- /** Does this iterable contain no elements?
- */
- override def isEmpty: Boolean = !this.iterator.hasNext
-
- /** Combines the elements of this iterable together using the binary
- * function <code>f</code>, from right to left, and starting with
- * the value <code>z</code>.
+ * Note: this method underlies the implementation of most other bulk operations.
+ * Subclasses should re-implement this method if a more efficient implementation exists.
*
- * @note Will not terminate for infinite-sized collections.
- * @note Might return different results for different runs, unless this iterable is ordered, or
- * the operator is associative and commutative.
- * @return <code>f(a<sub>0</sub>, f(a<sub>1</sub>, f(..., f(a<sub>n</sub>, z)...)))</code>
- * if the iterable is <code>[a<sub>0</sub>, a1, ..., a<sub>n</sub>]</code>.
- */
- override def foldRight[B](z: B)(op: (A, B) => B): B =
- this.iterator.foldRight(z)(op)
-
- /** Combines the elements of this iterable object together using the binary
- * operator <code>op</code>, from right to left
- * @note Will not terminate for infinite-sized collections.
- * @note Might return different results for different runs, unless this iterable is ordered, or
- * the operator is associative and commutative.
- * @param op The operator to apply
+ * @param f the function that is applied for its side-effect to every element.
+ * The result of function `f` is discarded.
*
- * @return <code>a<sub>0</sub> op (... op (a<sub>n-1</sub> op a<sub>n</sub>)...)</code>
- * if the iterable object has elements <code>a<sub>0</sub>, a<sub>1</sub>, ...,
- * a<sub>n</sub></code>.
+ * @tparam U the type parameter describing the result of function `f`.
+ * This result will always be ignored. Typically `U` is `Unit`,
+ * but this is not necessary.
*
- * @throws Predef.UnsupportedOperationException if the iterator is empty.
- */
- override def reduceRight[B >: A](op: (A, B) => B): B =
- this.iterator.reduceRight(op)
-
- /** The iterable itself */
- override def toIterable: Iterable[A] = thisCollection
-
- /** The first element of this iterable.
+ * @usecase def foreach(f: A => Unit): Unit
*
- * @note Might return different results for different runs, unless this iterable is ordered
- * @throws Predef.NoSuchElementException if the iterable is empty.
+ * @param f the function that is applied for its side-effect to every element.
+ * The result of function `f` is discarded.
*/
- override def head: A =
- if (isEmpty)
- throw new NoSuchElementException
- else
- this.iterator.next
-
- /** Return an iterable consisting only of the first <code>n</code>
- * elements of this iterable, or else the whole iterable, if it has less
- * than <code>n</code> elements.
- *
- * @param n the number of elements to take
- * @note Might return different results for different runs, unless this iterable is ordered
- */
- override def take(n: Int): Repr = {
+ def foreach[U](f: A => U): Unit =
+ iterator.foreach(f)
+
+ override /*TraversableLike*/ def forall(p: A => Boolean): Boolean =
+ iterator.forall(p)
+ override /*TraversableLike*/ def exists(p: A => Boolean): Boolean =
+ iterator.exists(p)
+ override /*TraversableLike*/ def find(p: A => Boolean): Option[A] =
+ iterator.find(p)
+/*
+ override /*TraversableLike*/ def mapFind[B](f: A => Option[B]): Option[B] =
+ iterator.mapFind(f)
+*/
+ override /*TraversableLike*/ def isEmpty: Boolean =
+ !iterator.hasNext
+ override /*TraversableLike*/ def foldRight[B](z: B)(op: (A, B) => B): B =
+ iterator.foldRight(z)(op)
+ override /*TraversableLike*/ def reduceRight[B >: A](op: (A, B) => B): B =
+ iterator.reduceRight(op)
+ override /*TraversableLike*/ def toIterable: Iterable[A] =
+ thisCollection
+
+ override /*TraversableLike*/ def head: A =
+ if (isEmpty) throw new NoSuchElementException
+ else iterator.next
+
+ override /*TraversableLike*/ def take(n: Int): Repr = {
val b = newBuilder
var i = 0
val it = iterator
@@ -164,17 +128,7 @@ self =>
b.result
}
- /** A sub-iterable starting at index `from`
- * and extending up to (but not including) index `until`.
- *
- * @note c.slice(from, to) is equivalent to (but possibly more efficient than)
- * c.drop(from).take(to - from)
- *
- * @param from The index of the first element of the returned subsequence
- * @param until The index of the element following the returned subsequence
- * @note Might return different results for different runs, unless this iterable is ordered
- */
- override def slice(from: Int, until: Int): Repr = {
+ override /*TraversableLike*/ def slice(from: Int, until: Int): Repr = {
val b = newBuilder
var i = from
val it = iterator drop from
@@ -185,13 +139,7 @@ self =>
b.result
}
- /** Returns the longest prefix of this iterable whose elements satisfy
- * the predicate <code>p</code>.
- *
- * @param p the test predicate.
- * @note Might return different results for different runs, unless this iterable is ordered
- */
- override def takeWhile(p: A => Boolean): Repr = {
+ override /*TraversableLike*/ def takeWhile(p: A => Boolean): Repr = {
val b = newBuilder
val it = iterator
while (it.hasNext) {
@@ -202,10 +150,12 @@ self =>
b.result
}
- /** Returns the rightmost <code>n</code> elements from this iterable.
+ /** Selects last ''n'' elements.
+ * $orderDependent
*
* @param n the number of elements to take
- * @note Might return different results for different runs, unless this iterable is ordered
+ * @return a $coll consisting only of the last `n` elements of this $coll, or else the
+ * whole $coll, if it has less than `n` elements.
*/
def takeRight(n: Int): Repr = {
val b = newBuilder
@@ -219,10 +169,12 @@ self =>
b.result
}
- /** Returns the iterable wihtout its rightmost <code>n</code> elements.
+ /** Selects all elements except first ''n'' ones.
+ * $orderDependent
*
- * @param n the number of elements to take
- * @note Might return different results for different runs, unless this iterable is ordered
+ * @param n The number of elements to take
+ * @return a $coll consisting of all elements of this $coll except the first `n` ones, or else the
+ * empty $coll, if this $coll has less than `n` elements.
*/
def dropRight(n: Int): Repr = {
val b = newBuilder
@@ -235,17 +187,7 @@ self =>
b.result
}
- /** Fills the given array <code>xs</code> with at most `len` elements of
- * this iterable starting at position `start`.
- * Copying will stop once either the end of the current iterable is reached or
- * `len` elements have been copied or the end of the array is reached.
- *
- * @note Will not terminate for infinite-sized collections.
- * @param xs the array to fill.
- * @param start starting index.
- * @param len number of elements to copy
- */
- override def copyToArray[B >: A](xs: Array[B], start: Int, len: Int) {
+ override /*TraversableLike*/ def copyToArray[B >: A](xs: Array[B], start: Int, len: Int) {
var i = start
val end = (start + len) min xs.length
val it = iterator
@@ -255,10 +197,29 @@ self =>
}
}
- /** Returns an iterable formed from this iterable and another iterable
+ /** Returns a $coll formed from this $coll and another iterable collection
* by combining corresponding elements in pairs.
- * If one of the two iterables is longer than the other, its remaining elements are ignored.
+ * If one of the two collections is longer than the other, its remaining elements are ignored.
+ *
+ * $orderDependent
+ *
* @param that The iterable providing the second half of each result pair
+ * @tparam A1 the type of the first half of the returned pairs (this is always a supertype
+ * of the collection's element type `A`).
+ * @tparam B the type of the second half of the returned pairs
+ * @tparam That $zipthatinfo
+ * @param bf $zipbfinfo
+ * @return a new collection of type `That` containing pairs consisting of
+ * corresponding elements of this $coll and `that`. The length
+ * of the returned collection is the minimum of the lengths of this $coll$ and `that`.
+ *
+ * @usecase def zip[B](that: Iterable[B]): $Coll[(A, B)]
+ *
+ * @param that The iterable providing the second half of each result pair
+ * @tparam B the type of the second half of the returned pairs
+ * @return a new $coll containing pairs consisting of
+ * corresponding elements of this $coll and `that`. The length
+ * of the returned collection is the minimum of the lengths of this $coll$ and `that`.
*/
def zip[A1 >: A, B, That](that: Iterable[B])(implicit bf: CanBuildFrom[Repr, (A1, B), That]): That = {
val b = bf(repr)
@@ -269,25 +230,33 @@ self =>
b.result
}
- /** Returns an iterable formed from this iterable and the specified iterable
- * <code>that</code> by associating each element of the former with
- * the element at the same position in the latter.
+ /** Returns a $coll formed from this $coll and another iterable collection
+ * by combining corresponding elements in pairs.
+ * If one of the two collections is shorter than the other,
+ * placeholder elements are used to extend the collection to the longer length.
*
- * @param that iterable <code>that</code> may have a different length
- * as the self iterable.
- * @param thisElem element <code>thisElem</code> is used to fill up the
- * resulting iterable if the self iterable is shorter than
- * <code>that</code>
- * @param thatElem element <code>thatElem</code> is used to fill up the
- * resulting iterable if <code>that</code> is shorter than
- * the self iterable
- * @return <code>Sequence((a<sub>0</sub>,b<sub>0</sub>), ...,
- * (a<sub>n</sub>,b<sub>n</sub>), (elem,b<sub>n+1</sub>),
- * ..., {elem,b<sub>m</sub>})</code>
- * when <code>[a<sub>0</sub>, ..., a<sub>n</sub>] zip
- * [b<sub>0</sub>, ..., b<sub>m</sub>]</code> is
- * invoked where <code>m &gt; n</code>.
+ * $orderDependent
*
+ * @param that the iterable providing the second half of each result pair
+ * @param thisElem the element to be used to fill up the result if this $coll is shorter than `that`.
+ * @param thatElem the element to be used to fill up the result if `that` is shorter than this $coll.
+ * @return a new collection of type `That` containing pairs consisting of
+ * corresponding elements of this $coll and `that`. The length
+ * of the returned collection is the maximum of the lengths of this $coll$ and `that`.
+ * If this $coll is shorter than `that`, `thisElem` values are used to pad the result.
+ * If `that` is shorter than this $coll, `thatElem` values are used to pad the result.
+ *
+ * @usecase def zipAll[B](that: Iterable[B], thisElem: A, thatElem: B): $Coll[(A, B)]
+ *
+ * @param that The iterable providing the second half of each result pair
+ * @param thisElem the element to be used to fill up the result if this $coll is shorter than `that`.
+ * @param thatElem the element to be used to fill up the result if `that` is shorter than this $coll.
+ * @tparam B the type of the second half of the returned pairs
+ * @return a new $coll containing pairs consisting of
+ * corresponding elements of this $coll and `that`. The length
+ * of the returned collection is the maximum of the lengths of this $coll$ and `that`.
+ * If this $coll is shorter than `that`, `thisElem` values are used to pad the result.
+ * If `that` is shorter than this $coll, `thatElem` values are used to pad the result.
*/
def zipAll[B, A1 >: A, That](that: Iterable[B], thisElem: A1, thatElem: B)(implicit bf: CanBuildFrom[Repr, (A1, B), That]): That = {
val b = bf(repr)
@@ -302,7 +271,30 @@ self =>
b.result
}
- /** Zips this iterable with its indices (startiong from 0).
+ /** Zips this $coll with its indices.
+ *
+ * $orderDependent
+ *
+ * @tparam A1 the type of the first half of the returned pairs (this is always a supertype
+ * of the collection's element type `A`).
+ * @tparam That the class of the returned collection. Where possible, `That` is
+ * the same class as the current collection class `Repr`, but this
+ * depends on the element type `(A1, Int)` being admissible for that class,
+ * which means that an implicit instance of type `CanBuildFrom[Repr, (A1, Int), That]`.
+ * is found.
+ * @tparam bf an implicit value of class `CanBuildFrom` which determines the
+ * result class `That` from the current representation type `Repr`
+ * and the new element type `(A1, Int)`.
+ * @return A new collection of type `That` containing pairs consisting of all elements of this
+ * $coll paired with their index. Indices start at `0`.
+ *
+ * @usecase def zipWithIndex: $Coll[(A, Int)]
+ *
+ * @return A new $coll containing pairs consisting of all elements of this
+ * $coll paired with their index. Indices start at `0`.
+ * @example
+ * `List("a", "b", "c").zipWithIndex = List(("a", 0), ("b", 1), ("c", 2))`
+ *
*/
def zipWithIndex[A1 >: A, That](implicit bf: CanBuildFrom[Repr, (A1, Int), That]): That = {
val b = bf(repr)
@@ -314,12 +306,19 @@ self =>
b.result
}
- /** Checks if the other iterable object contains the same elements as this one.
+ /** Checks if the other iterable collection contains the same elements in the same order as this $coll.
+ *
+ * $orderDependent
+ * $willNotTerminateInf
+ *
+ * @param that the collection to compare with.
+ * @tparam B the type of the elements of collection `that`.
+ * @return `true`, if both collections contain the same elements in the same order, `false` otherwise.
*
- * @note will not terminate for infinite-sized iterables.
- * @param that the other iterable
- * @return true, iff both iterables contain the same elements in the same order.
- * @note Might return different results for different runs, unless this iterable is ordered
+ * @usecase def sameElements(that: Iterable[A]): Boolean
+ *
+ * @param that the collection to compare with.
+ * @return `true`, if both collections contain the same elements in the same order, `false` otherwise.
*/
def sameElements[B >: A](that: Iterable[B]): Boolean = {
val these = this.iterator
@@ -331,44 +330,36 @@ self =>
!these.hasNext && !those.hasNext
}
- /** Returns a stream with all elements in this iterable object.
- */
- override def toStream: Stream[A] = iterator.toStream
+ override /*TraversableLike*/ def toStream: Stream[A] = iterator.toStream
/** Method called from equality methods, so that user-defined subclasses can
* refuse to be equal to other collections of the same kind.
+ * @param that The object with which this $coll should be compared
+ * @return `true`, if this $coll can possibly equal `that`, `false` otherwise. The test
+ * takes into consideration only the run-time types of objects but ignores their elements.
*/
- override def canEqual(that: Any) = true
+ override /*TraversableLike*/ def canEqual(that: Any) = true
- /** Creates a view of this iterable @see IterableView
- */
- override def view = new IterableView[A, Repr] {
+ override /*TraversableLike*/ def view = new IterableView[A, Repr] {
protected lazy val underlying = self.repr
override def iterator = self.iterator
}
- /** A sub-iterable view starting at index `from`
- * and extending up to (but not including) index `until`.
- *
- * @param from The index of the first element of the slice
- * @param until The index of the element following the slice
- * @note The difference between `view` and `slice` is that `view` produces
- * a view of the current iterable, whereas `slice` produces a new iterable.
- *
- * @note Might return different results for different runs, unless this iterable is ordered
- * @note view(from, to) is equivalent to view.slice(from, to)
- */
- override def view(from: Int, until: Int) = view.slice(from, until)
+ override /*TraversableLike*/ def view(from: Int, until: Int) = view.slice(from, until)
+ /** @deprecated use `head' instead. */
@deprecated("use `head' instead") def first: A = head
- /** <code>None</code> if iterable is empty. */
+ /** <code>None</code> if iterable is empty.
+ * @deprecated "use `headOption' instead"
+ */
@deprecated("use `headOption' instead") def firstOption: Option[A] = headOption
/**
* returns a projection that can be used to call non-strict <code>filter</code>,
* <code>map</code>, and <code>flatMap</code> methods that build projections
* of the collection.
+ * @deprecated "use `view' instead"
*/
@deprecated("use `view' instead")
def projection = view
diff --git a/src/library/scala/collection/Iterator.scala b/src/library/scala/collection/Iterator.scala
index fa5c2d3597..ac6cb890c4 100644
--- a/src/library/scala/collection/Iterator.scala
+++ b/src/library/scala/collection/Iterator.scala
@@ -636,6 +636,21 @@ trait Iterator[+A] { self =>
res
}
+ /** Applies option-valued function to successive elements of this iterator
+ * until a defined value is found.
+ *
+ * @param f the function to be applied to successive elements.
+ * @return an option value containing the first defined result of
+ * `f`, or `None` if `f` returns `None` for all all elements.
+ def mapFind[B](f: A => Option[B]): Option[B] = {
+ var res: Option[B] = None
+ while (res.isEmpty && hasNext) {
+ res = f(next())
+ }
+ res
+ }
+ */
+
/** Returns index of the first element satisfying a predicate, or -1.
*
* @note may not terminate for infinite-sized collections.
diff --git a/src/library/scala/collection/LinearSeqLike.scala b/src/library/scala/collection/LinearSeqLike.scala
index 4fb9b4ad79..08bb071da9 100644
--- a/src/library/scala/collection/LinearSeqLike.scala
+++ b/src/library/scala/collection/LinearSeqLike.scala
@@ -152,7 +152,17 @@ trait LinearSeqLike[+A, +Repr <: LinearSeqLike[A, Repr]] extends SeqLike[A, Repr
}
None
}
-
+/*
+ override def mapFind[B](f: A => Option[B]): Option[B] = {
+ var res: Option[B] = None
+ var these = this
+ while (res.isEmpty && !these.isEmpty) {
+ res = f(these.head)
+ these = these.tail
+ }
+ res
+ }
+*/
/** Combines the elements of this list together using the binary
* function <code>f</code>, from left to right, and starting with
* the value <code>z</code>.
diff --git a/src/library/scala/collection/MapLike.scala b/src/library/scala/collection/MapLike.scala
index a1ea657553..a9ea82b2f9 100644
--- a/src/library/scala/collection/MapLike.scala
+++ b/src/library/scala/collection/MapLike.scala
@@ -14,28 +14,30 @@ import generic._
import mutable.{Builder, StringBuilder, MapBuilder}
import PartialFunction._
-/** <p>
- * A generic template for maps from keys of type <code>A</code> to values
- * of type <code>B</code>.<br/>
- * To implement a concrete map, you need to provide implementations of the
- * following methods (where <code>This</code> is the type of the map in
+/**
+ * A generic template for maps from keys of type `A` to values
+ * of type `B`.
+ *
+ * To implement a concrete map, 'you' need to provide implementations of the
+ * following methods (where `This` is the type of the map in
* question):
- * </p>
- * <pre>
- * <b>def</b> get(key: A): Option[B]
- * <b>def</b> iterator: Iterator[(A, B)]
- * <b>def</b> + [B1 >: B](kv: (A, B1)): This
- * <b>def</b> -(key: A): This</pre>
- * <p>
+ * {{{
+ * def get(key: A): Option[B]
+ *
+ * def iterator: Iterator[(A, B)]
+ *
+ * def + [B1 >: B](kv: (A, B1)): This
+ *
+ * def -(key: A): This</pre>
+ * }}}
* If you wish that methods <code>like</code>, <code>take</code>, <code>drop</code>,
* <code>filter</code> return the same kind of map, you should also override:
- * </p>
- * <pre>
- * <b>def</b> empty: This</pre>
- * <p>
- * It is also good idea to override methods <code>foreach</code> and
- * <code>size</code> for efficiency.
- * </p>
+ * {{{
+ * def empty: This
+ * }}}
+ *
+ * It is also good idea to override methods `foreach` and
+ * `size` for efficiency.
*
* @author Martin Odersky
* @version 2.8
diff --git a/src/library/scala/collection/SeqLike.scala b/src/library/scala/collection/SeqLike.scala
index 4d096a88c6..5e7ea8ebfa 100644
--- a/src/library/scala/collection/SeqLike.scala
+++ b/src/library/scala/collection/SeqLike.scala
@@ -10,20 +10,19 @@
package scala.collection
-import generic._
+
import mutable.{ListBuffer, HashMap, GenericArray}
import immutable.{List, Range}
-
-// import immutable.{List, Nil, ::}
import generic._
-/** Contains a KMP implementation, based on the undoubtedly reliable wikipedia entry.
- *
- * @author paulp
- * @since 2.8
+/** The companion object for trait `SeqLike`.
*/
object SeqLike {
+ /** A KMP implementation, based on the undoubtedly reliable wikipedia entry.
+ * @author paulp
+ * @since 2.8
+ */
private def KMP[B](S: Seq[B], W: Seq[B]): Option[Int] = {
// trivial cases
if (W.isEmpty) return Some(0)
@@ -73,6 +72,8 @@ object SeqLike {
None
}
+ /** Waiting for a doc comment from Paul
+ */
def indexOf[B](
source: Seq[B], sourceOffset: Int, sourceCount: Int,
target: Seq[B], targetOffset: Int, targetCount: Int,
@@ -82,6 +83,8 @@ object SeqLike {
case Some(x) => x + fromIndex
}
+ /** Waiting for a doc comment from Paul
+ */
def lastIndexOf[B](
source: Seq[B], sourceOffset: Int, sourceCount: Int,
target: Seq[B], targetOffset: Int, targetCount: Int,
@@ -96,41 +99,89 @@ object SeqLike {
}
}
-/** Class <code>Seq[A]</code> represents sequences of elements
- * of type <code>A</code>.
- * It adds the following methods to class Iterable:
- * `length`, `lengthCompare`, `apply`, `isDefinedAt`, `segmentLength`, `prefixLength`,
- * `indexWhere`, `indexOf`, `lastIndexWhere`, `lastIndexOf`, `reverse`, `reverseIterator`,
- * `startsWith`, `endsWith`, `indexOfSlice`, , `zip`, `zipAll`, `zipWithIndex`.
+/** A template trait for sequences of type `Seq[A]`, representing
+ * sequences of elements of type <code>A</code>.
+ *
+ * Sequences are special cases of iterable collections of class `Iterable`.
+ * Unlike iterables, sequences always have a defined order of elements.
+ * Sequences provide a method `apply` for indexing. Indices range from `0` up the the `length` of
+ * a sequence. Sequences support a number to find occurrences of elements or subsequences, including
+ * `segmentLength`, `prefixLength`, `indexWhere`, `indexOf`, `lastIndexWhere`, `lastIndexOf`,
+ * `startsWith`, `endsWith`, `indexOfSlice`.
*
+ * Another way to see a sequence is as a `PartialFunction` from `Int` values
+ * to the element type of the sequence. The `isDefinedAt` method of a sequence
+ * returns `true` for the interval from `0` until `length`.
+ *
+ * Sequences can be accessed in reverse order of their elements, using methods
+ * `reverse` and `reverseIterator`.
+ *
+ * Sequences have two principle subtraits, `IndexedSeq` and `LinearSeq`, which give different guarantees for performance.
+ * An `IndexedSeq` provides fast random-access of elements and a fast `length` operation.
+ * A `LinearSeq` provides fast access only to the first element via `head`, but also
+ * has a fast `tail` operation.
*
* @author Martin Odersky
* @author Matthias Zenger
* @version 1.0, 16/07/2003
* @since 2.8
+ *
+ * @tparam A the element type of the collection
+ * @tparam Repr the type of the actual collection containing the elements.
+ *
+ * @define Coll Seq
+ * @define coll sequence
+ * @define thatinfo the class of the returned collection. Where possible, `That` is
+ * the same class as the current collection class `Repr`, but this
+ * depends on the element type `B` being admissible for that class,
+ * which means that an implicit instance of type `CanBuildFrom[Repr, B, That]`
+ * is found.
+ * @define bfinfo an implicit value of class `CanBuildFrom` which determines the
+ * result class `That` from the current representation type `Repr`
+ * and the new element type `B`.
+ * @define orderDependent
+ * @define orderDependentFold
+ * @define mayNotTerminateInf
+ *
+ * Note: may not terminate for infinite-sized collections.
+ * @define willNotTerminateInf
+ *
+ * Note: will not terminate for infinite-sized collections.
*/
trait SeqLike[+A, +Repr] extends IterableLike[A, Repr] { self =>
override protected[this] def thisCollection: Seq[A] = this.asInstanceOf[Seq[A]]
override protected[this] def toCollection(repr: Repr): Seq[A] = repr.asInstanceOf[Seq[A]]
- /** Returns the length of the sequence.
+ /** The length of the $coll.
+ *
+ * $willNotTerminateInf
+ *
+ * Note: `xs.length` and `xs.size` yield the same result.
+ *
+ * @return the number of elements in this $coll.
*/
def length: Int
- /** Returns the elements at position `idx`
+ /** Selects an element by its index in the $coll
+ *
+ * @param idx The index to select
+ * @return the element of tyh
*/
def apply(idx: Int): A
- /** Result of comparing <code>length</code> with operand <code>len</code>.
- * returns <code>x</code> where
- * <code>x &lt; 0</code> iff <code>this.length &lt; len</code>
- * <code>x == 0</code> iff <code>this.length == len</code>
- * <code>x &gt; 0</code> iff <code>this.length &gt; len</code>.
+ /** Compares the length of this $coll to a test value.
*
- * The method as implemented here does not call length directly; its running time
- * is O(length min len) instead of O(length). The method should be overwritten
- * if computing length is cheap.
+ * @param len the test value that gets compared with the length.
+ * @return A value `x` where
+ * {{{
+ * x < 0 if this.length < len
+ * x == 0 if this.length == len
+ * x > 0 if this.length > len
+ * }}}
+ * The method as implemented here does not call `length` directly; its running time
+ * is `O(length min len)` instead of `O(length)`. The method should be overwritten
+ * if computing `length` is cheap.
*/
def lengthCompare(len: Int): Int = {
var i = 0
@@ -142,18 +193,32 @@ trait SeqLike[+A, +Repr] extends IterableLike[A, Repr] { self =>
i - len
}
- /** Should always be <code>length</code> */
+ /** The size of this $coll, equivalent to `length`.
+ *
+ * $willNotTerminateInf
+ *
+ * @return the number of elements in this $coll.
+ */
override def size = length
- /** Is this partial function defined for the index <code>x</code>?
+ /** Tests whether this $coll contains given index.
+ *
+ * The implementations of methods `apply` and `isDefinedAt` turn a `Seq[A]` into
+ * a `PartialFunction[Int, A]`.
+ *
+ * @param idx the index to test
+ * @return `true` if this $coll contains an element at position `idx`, `false` otherwise.
*/
- def isDefinedAt(x: Int): Boolean = (x >= 0) && (x < length)
+ def isDefinedAt(idx: Int): Boolean = (idx >= 0) && (idx < length)
- /** Returns length of longest segment starting from a start index `from`
- * such that every element of the segment satisfies predicate `p`.
- * @note may not terminate for infinite-sized collections.
- * @param p the predicate
- * @param from the start index
+ /** Computes length of longest segment whose elements all satisfy some preficate.
+ *
+ * $mayNotTerminateInf
+ *
+ * @param p the predicate used to test elements.
+ * @param from the index where the search starts.
+ * @return the length of the longest segment of this $coll starting from index `from`
+ * such that every element of the segment satisfies the predicate `p`.
*/
def segmentLength(p: A => Boolean, from: Int): Int = {
var i = 0
@@ -163,26 +228,34 @@ trait SeqLike[+A, +Repr] extends IterableLike[A, Repr] { self =>
i
}
- /** Returns length of longest prefix of this seqence
- * such that every element of the prefix satisfies predicate `p`.
- * @note may not terminate for infinite-sized collections.
- * @param p the predicate
+ /** Returns the length of the longest prefix whose elements all satisfy some preficate.
+ *
+ * $mayNotTerminateInf
+ *
+ * @param p the predicate used to test elements.
+ * @return the length of the longest prefix of this $coll
+ * such that every element of the segment satisfies the predicate `p`.
*/
def prefixLength(p: A => Boolean) = segmentLength(p, 0)
- /** Returns index of the first element satisfying a predicate, or -1, if none exists.
+ /** Finds index of first element satisfying some predicate.
*
- * @note may not terminate for infinite-sized collections.
- * @param p the predicate
+ * $mayNotTerminateInf
+ *
+ * @param p the predicate used to test elements.
+ * @return the index of the first element of this $coll that satisfies the predicate `p`,
+ * or `-1`, if none exists.
*/
def indexWhere(p: A => Boolean): Int = indexWhere(p, 0)
- /** Returns index of the first element starting from a start index
- * satisying a predicate, or -1, if none exists.
+ /** Finds index of the first element satisfying some predicate after or at some start index.
+ *
+ * $mayNotTerminateInf
*
- * @note may not terminate for infinite-sized collections.
- * @param p the predicate
- * @param from the start index
+ * @param p the predicate used to test elements.
+ * @param from the start index
+ * @return the index `>= from` of the first element of this $coll that satisfies the predicate `p`,
+ * or `-1`, if none exists.
*/
def indexWhere(p: A => Boolean, from: Int): Int = {
var i = from
@@ -192,63 +265,95 @@ trait SeqLike[+A, +Repr] extends IterableLike[A, Repr] { self =>
if (it.hasNext) i else -1
}
- /** Returns index of the first element satisying a predicate, or -1. */
- @deprecated("Use `indexWhere' instead")
+ /** Returns index of the first element satisying a predicate, or `-1`.
+ * @deprecated "Use `indexWhere` instead"
+ */
def findIndexOf(p: A => Boolean): Int = indexWhere(p)
- /** Returns the index of the first occurence of the specified
- * object in this sequence.
+ /** Finds index of first occurrence of some value in this $coll.
*
- * @note may not terminate for infinite-sized collections.
- * @param elem element to search for.
- * @return the index in this sequence of the first occurence of the
- * specified element, or -1 if the sequence does not contain
- * this element.
+ * $mayNotTerminateInf
+ *
+ * @param elem the element value to search for.
+ * @tparam B the type of the element `elem`.
+ * @return the index of the first element of this $coll that is equal (wrt `==`)
+ * tp `elem`, or `-1`, if none exists.
+ *
+ * @usecase def indexOf(elem: A): Int
+ *
+ * @param elem the element value to search for.
+ * @return the index of the first element of this $coll that is equal (wrt `==`)
+ * to `elem`, or `-1`, if none exists.
*/
def indexOf[B >: A](elem: B): Int = indexOf(elem, 0)
- /** Returns the index of the first occurence of the specified
- * object in this sequence, starting from a start index, or
- * -1, if none exists.
+ /** Finds index of first occurrence of some value in this $coll after or at some start index.
+ *
+ * $mayNotTerminateInf
*
- * @note may not terminate for infinite-sized collections.
- * @param elem element to search for.
+ * @param elem the element value to search for.
+ * @tparam B the type of the element `elem`.
+ * @param from the start index
+ * @return the index `>= from` of the first element of this $coll that is equal (wrt `==`)
+ * tp `elem`, or `-1`, if none exists.
+ *
+ * @usecase def indexOf(elem: A): Int
+ *
+ * @param elem the element value to search for.
+ * @param from the start index
+ * @return the index `>= from` of the first element of this $coll that is equal (wrt `==`)
+ * to `elem`, or `-1`, if none exists.
*/
def indexOf[B >: A](elem: B, from: Int): Int = indexWhere(elem ==, from)
- /** Returns the index of the last occurence of the specified element
- * in this sequence, or -1 if the sequence does not contain this element.
+ /** Finds index of last occurrence of some value in this $coll.
+ *
+ * $willNotTerminateInf
+ *
+ * @param elem the element value to search for.
+ * @tparam B the type of the element `elem`.
+ * @return the index of the last element of this $coll that is equal (wrt `==`)
+ * to `elem`, or `-1`, if none exists.
*
- * @param elem element to search for.
- * @return the index in this sequence of the last occurence of the
- * specified element, or -1 if the sequence does not contain
- * this element.
+ * @usecase def lastIndexOf(elem: A): Int
+ *
+ * @param elem the element value to search for.
+ * @return the index of the last element of this $coll that is equal (wrt `==`)
+ * to `elem`, or `-1`, if none exists.
*/
def lastIndexOf[B >: A](elem: B): Int = lastIndexWhere(elem ==)
- /** Returns the index of the last
- * occurence of the specified element in this sequence
- * before or at a given end index,
- * or -1 if the sequence does not contain this element.
- *
- * @param elem element to search for.
- * @param end the end index
- */
+ /** Finds index of last occurrence of some value in this $coll before or at a given end index.
+ *
+ * @param elem the element value to search for.
+ * @param end the end index.
+ * @tparam B the type of the element `elem`.
+ * @return the index `<= end` of the last element of this $coll that is equal (wrt `==`)
+ * to `elem`, or `-1`, if none exists.
+ *
+ * @usecase def lastIndexOf(elem: A): Int
+ *
+ * @param elem the element value to search for.
+ * @return the index `<= end` of the last element of this $coll that is equal (wrt `==`)
+ * to `elem`, or `-1`, if none exists.
+ */
def lastIndexOf[B >: A](elem: B, end: Int): Int = lastIndexWhere(elem ==, end)
- /** Returns index of the last element satisying a predicate, or -1, if none exists.
+ /** Finds index of last element satisfying some predicate.
+ *
+ * $willNotTerminateInf
*
- * @param p the predicate
- * @return the index of the last element satisfying <code>p</code>,
- * or -1 if such an element does not exist
+ * @param p the predicate used to test elements.
+ * @return the index of the last element of this $coll that satisfies the predicate `p`,
+ * or `-1`, if none exists.
*/
def lastIndexWhere(p: A => Boolean): Int = lastIndexWhere(p, length - 1)
- /** Returns index of the last element not exceeding a given end index
- * and satisying a predicate, or -1 if none exists.
+ /** Finds index of last element satisfying some predicate before or at given end index.
*
- * @param end the end index
- * @param p the predicate
+ * @param p the predicate used to test elements.
+ * @return the index `<= end` of the last element of this $coll that satisfies the predicate `p`,
+ * or `-1`, if none exists.
*/
def lastIndexWhere(p: A => Boolean, end: Int): Int = {
var i = length - 1
@@ -257,8 +362,11 @@ trait SeqLike[+A, +Repr] extends IterableLike[A, Repr] { self =>
i
}
- /** A sequence of type <code>C</code> consisting of all elements of
- * this sequence in reverse order.
+ /** Returns new $coll wih elements in reversed order.
+ *
+ * $willNotTerminateInf
+ *
+ * @return A new $coll with all elements of this $coll in reversed order.
*/
def reverse: Repr = {
var xs: List[A] = List()
@@ -270,18 +378,34 @@ trait SeqLike[+A, +Repr] extends IterableLike[A, Repr] { self =>
b.result
}
- /** Apply a function to all the elements of the sequence, and return the
- * reversed sequence of results. This is equivalent to a call to <code>reverse</code>
- * followed by a call to <code>map</code>, but more efficient.
+ /**
+ * Builds a new collection by applying a function to all elements of this $coll and
+ * collecting the results in reversed order.
+ *
+ * $willNotTerminateInf
+ *
+ * Note: `xs.reverseMap(f)` is the same as `xs.reverse.map(f)` but might be more efficient.
+ *
+ * @param f the function to apply to each element.
+ * @tparam B the element type of the returned collection.
+ * @tparam That $thatinfo
+ * @param bf $bfinfo
+ * @return a new collection of type `That` resulting from applying the given function
+ * `f` to each element of this $coll and collecting the results in reversed order.
+ *
+ * @usecase def reverseMap[B](f: A => B): $Coll[B]
+ *
+ * Note: `xs.reverseMap(f)` is the same as `xs.reverse.map(f)` but might be more efficient.
*
- * @param f the function to apply to each elements.
- * @return the reversed seq of results.
+ * @param f the function to apply to each element.
+ * @tparam B the element type of the returned collection.
+ * @return a new $coll resulting from applying the given function
+ * `f` to each element of this $coll and collecting the results in reversed order.
*/
def reverseMap[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That = {
var xs: List[A] = List()
for (x <- this)
xs = x :: xs
-
val b = bf(repr)
for (x <- xs)
b += f(x)
@@ -289,25 +413,30 @@ trait SeqLike[+A, +Repr] extends IterableLike[A, Repr] { self =>
b.result
}
- /** The elements of this sequence in reversed order
+ /** An iterator yielding elements in reversed order.
+ *
+ * $willNotTerminateInf
+ *
+ * Note: `xs.reverseIterator` is the same as `xs.reverse.iterator` but might be more efficient.
+ *
+ * @return an iterator yielding the elements of this $coll in reversed order
*/
def reverseIterator: Iterator[A] = toCollection(reverse).iterator
+ /** @deprecated use `reverseIterator` instead */
@deprecated("use `reverseIterator' instead")
def reversedElements = reverseIterator
- /**
- * Checks whether the argument sequence is contained at the
- * specified index within the receiver object.
+ /** Checks whether this $coll contains the given sequence at a given index.
*
* If the both the receiver object, <code>this</code> and
* the argument, <code>that</code> are infinite sequences
* this method may not terminate.
*
- * @return true if <code>that</code> is contained in
- * <code>this</code>, at the specified index, otherwise false
- *
- * @see String.startsWith
+ * @param that the candidate sequence
+ * @param offset the index where the sequence is searched.
+ * @return `true` if the sequence `that` is contained in this $coll at index `offset`,
+ * otherwise `false`.
*/
def startsWith[B](that: Seq[B], offset: Int): Boolean = {
val i = this.iterator drop offset
@@ -319,10 +448,10 @@ trait SeqLike[+A, +Repr] extends IterableLike[A, Repr] { self =>
!j.hasNext
}
- /**
- * Check whether the receiver object starts with the argument sequence.
+ /** Checks whether this $coll starts with the given sequence.
*
- * @return true if <code>that</code> is a prefix of <code>this</code>,
+ * @param that the candidate sequence
+ * @return `true` if this collection has `that` as a prefix, `false` otherwise.
* otherwise false
*/
def startsWith[B](that: Seq[B]): Boolean = startsWith(that, 0)
diff --git a/src/library/scala/collection/TraversableLike.scala b/src/library/scala/collection/TraversableLike.scala
index 44cb7ced63..0ff6227a3a 100644
--- a/src/library/scala/collection/TraversableLike.scala
+++ b/src/library/scala/collection/TraversableLike.scala
@@ -63,14 +63,12 @@ import immutable.{List, Stream, Nil, ::}
*
* @define Coll Traversable
* @define coll traversable collection
- * @define thatinfo
- * the class of the returned collection. Where possible, `That` is
+ * @define thatinfo the class of the returned collection. Where possible, `That` is
* the same class as the current collection class `Repr`, but this
* depends on the element type `B` being admissible for that class,
* which means that an implicit instance of type `CanBuildFrom[Repr, B, That]`
* is found.
- * @define bfinfo
- * an implicit value of class `CanBuildFrom` which determines the
+ * @define bfinfo an implicit value of class `CanBuildFrom` which determines the
* result class `That` from the current representation type `Repr`
* and the new element type `B`.
* @define orderDependent
@@ -100,12 +98,13 @@ self =>
*/
def repr: Repr = this.asInstanceOf[Repr]
- /** The underlying collection seen as an instance of `Traversable`.
- * By default this is implemented as the `TraversableLike` object itself, but this can be overridden.
+ /** The underlying collection seen as an instance of `$Coll`.
+ * By default this is implemented as the current collection object itself,
+ * but this can be overridden.
*/
protected[this] def thisCollection: Traversable[A] = this.asInstanceOf[Traversable[A]]
- /** A conversion from collections of type `Repr` to `Traversable` objects.
+ /** A conversion from collections of type `Repr` to `$Coll` objects.
* By default this is implemented as just a cast, but this can be overridden.
*/
protected[this] def toCollection(repr: Repr): Traversable[A] = repr.asInstanceOf[Traversable[A]]
@@ -116,8 +115,9 @@ self =>
/** Applies a function `f` to all elements of this $coll.
*
- * Note: this method underlies the implementation of most other bulk operations.
- * It's important to implement this method in an efficient way.
+ * Note: this method underlies the implementation of most other bulk operations.
+ * It's important to implement this method in an efficient way.
+ *
*
* @param f the function that is applied for its side-effect to every element.
* The result of function `f` is discarded.
@@ -126,7 +126,7 @@ self =>
* This result will always be ignored. Typically `U` is `Unit`,
* but this is not necessary.
*
- * @usage def foreach(f: A => Unit): Unit
+ * @usecase def foreach(f: A => Unit): Unit
*
* @param f the function that is applied for its side-effect to every element.
* The result of function `f` is discarded.
@@ -184,7 +184,7 @@ self =>
* @return a new collection of type `That` which contains all elements of this $coll
* followed by all elements of `that`.
*
- * @usage def ++(that: Traversable[A]): $Coll[A]
+ * @usecase def ++(that: Traversable[A]): $Coll[A]
*
* @param that the traversable to append.
* @return a new $coll which contains all elements of this $coll
@@ -206,7 +206,7 @@ self =>
* @return a new collection of type `That` which contains all elements of this $coll
* followed by all elements of `that`.
*
- * @usage def ++(that: Iterator[A]): $Coll[A]
+ * @usecase def ++(that: Iterator[A]): $Coll[A]
*
* @param that the iterator to append.
* @return a new $coll which contains all elements of this $coll
@@ -228,7 +228,7 @@ self =>
* @return a new collection of type `That` resulting from applying the given function
* `f` to each element of this $coll and collecting the results.
*
- * @usage def map[B](f: A => B): $Coll[B]
+ * @usecase def map[B](f: A => B): $Coll[B]
*
* @param f the function to apply to each element.
* @tparam B the element type of the returned collection.
@@ -251,7 +251,7 @@ self =>
* @return a new collection of type `That` resulting from applying the given collection-valued function
* `f` to each element of this $coll and concatenating the results.
*
- * @usage def flatMap[B](f: A => Traversable[B]): $Coll[B]
+ * @usecase def flatMap[B](f: A => Traversable[B]): $Coll[B]
*
* @param f the function to apply to each element.
* @tparam B the element type of the returned collection.
@@ -266,7 +266,7 @@ self =>
/** Selects all elements of this $coll which satisfy a predicate.
*
- * @param p the predicate used used to test elements.
+ * @param p the predicate used to test elements.
* @return a new $coll consisting of all elements of this $coll that satisfy the given
* predicate `p`. The order of the elements is preserved.
*/
@@ -296,7 +296,7 @@ self =>
* `pf` to each element on which it is defined and collecting the results.
* The order of the elements is preserved.
*
- * @usage def partialMap[B](pf: PartialFunction[Any, B]): $Coll[B]
+ * @usecase def partialMap[B](pf: PartialFunction[Any, B]): $Coll[B]
*
* @param pf the partial function which filters and maps the $coll.
* @return a new $coll resulting from applying the given partial function
@@ -309,6 +309,34 @@ self =>
b.result
}
+ /** Builds a new collection by applying an option-valued function to all elements of this $coll
+ * on which the function is defined.
+ *
+ * @param f the option-valued function which filters and maps the $coll.
+ * @tparam B the element type of the returned collection.
+ * @tparam That $thatinfo
+ * @param bf $bfinfo
+ * @return a new collection of type `That` resulting from applying the option-valued function
+ * `f` to each element and collecting all defined results.
+ * The order of the elements is preserved.
+ *
+ * @usecase def filterMap[B](f: A => Option[B]): $Coll[B]
+ *
+ * @param pf the partial function which filters and maps the $coll.
+ * @return a new $coll resulting from applying the given option-valued function
+ * `f` to each element and collecting all defined results.
+ * The order of the elements is preserved.
+ def filterMap[B, That](f: A => Option[B])(implicit bf: CanBuildFrom[Repr, B, That]): That = {
+ val b = bf(repr)
+ for (x <- this)
+ f(x) match {
+ case Some(y) => b += y
+ case _ =>
+ }
+ b.result
+ }
+ */
+
/** Partitions this $coll in two ${coll}s according to a predicate.
*
* @param p the predicate on which to partition.
@@ -356,7 +384,7 @@ self =>
*
* $mayNotTerminateInf
*
- * @param p the predicate used used to test elements.
+ * @param p the predicate used to test elements.
* @return `true` if the given predicate `p` holds for all elements
* of this $coll, otherwise `false`.
*/
@@ -373,7 +401,7 @@ self =>
*
* $mayNotTerminateInf
*
- * @param p the predicate used used to test elements.
+ * @param p the predicate used to test elements.
* @return `true` if the given predicate `p` holds for some of the elements
* of this $coll, otherwise `false`.
*/
@@ -388,7 +416,7 @@ self =>
/** Counts the number of elements in the $coll which satisfy a predicate.
*
- * @param p the predicate used used to test elements.
+ * @param p the predicate used to test elements.
* @return the number of elements satisfying the predicate `p`.
*
*
@@ -406,7 +434,7 @@ self =>
* $mayNotTerminateInf
* $orderDependent
*
- * @param p the predicate used used to test elements.
+ * @param p the predicate used to test elements.
* @return an option value containing the first element in the $coll
* that satisfies `p`, or `None` if none exists.
*/
@@ -419,6 +447,28 @@ self =>
result
}
+ /** Applies option-valued function to successive elements of this $coll
+ * until a defined value is found.
+ *
+ * $mayNotTerminateInf
+ * $orderDependent
+ *
+ * @param f the function to be applied to successive elements.
+ * @return an option value containing the first defined result of
+ * `f`, or `None` if `f` returns `None` for all all elements.
+ def mapFind[B](f: A => Option[B]): Option[B] = {
+ var result: Option[B] = None
+ breakable {
+ for (x <- this)
+ f(x) match {
+ case s @ Some(_) => result = s; break
+ case _ =>
+ }
+ }
+ result
+ }
+ */
+
/** Applies a binary operator to a start value and all elements of this $coll, going left to right.
*
* $willNotTerminateInf
@@ -430,9 +480,9 @@ self =>
* @return the result of inserting `op` between consecutive elements of this $coll$,
* going left to right with the start value `z` on the left:
* {{{
- * op(...op(z, x_1), x_2, ..., x_n)
+ * op(...op(z, x,,1,,), x,,2,,, ..., x,,n,,)
* }}}
- * where `x_1, ..., x_n` are the elements of this $coll.
+ * where `x,,1,,, ..., x,,n,,` are the elements of this $coll.
*
*/
def foldLeft[B](z: B)(op: (B, A) => B): B = {
@@ -454,9 +504,9 @@ self =>
* @return the result of inserting `op` between consecutive elements of this $coll$,
* going left to right with the start value `z` on the left:
* {{{
- * op(...op(op(z, x_1), x_2), ..., x_n)
+ * op(...op(op(z, x,,1,,), x,,2,,), ..., x,,n,,)
* }}}
- * where `x_1, ..., x_n` are the elements of this $coll.
+ * where `x,,1,,, ..., x,,n,,` are the elements of this $coll.
*/
def /: [B](z: B)(op: (B, A) => B): B = foldLeft(z)(op)
@@ -467,9 +517,9 @@ self =>
* @return the result of inserting `op` between consecutive elements of this $coll$,
* going right to left with the start value `z` on the right:
* {{{
- * op(x_1, op(x_2, ... op(x_n, z)...))
+ * op(x,,1,,, op(x,,2,,, ... op(x,,n,,, z)...))
* }}}
- * where `x_1, ..., x_n` are the elements of this $coll.
+ * where `x,,1,,, ..., x,,n,,` are the elements of this $coll.
*
* $willNotTerminateInf
* $orderDependentFold
@@ -492,9 +542,9 @@ self =>
* @return the result of inserting `op` between consecutive elements of this $coll$,
* going right to left with the start value `z` on the right:
* {{{
- * op(x_1, op(x_2, ... op(x_n, z)...))
+ * op(x,,1,,, op(x,,2,,, ... op(x,,n,,, z)...))
* }}}
- * where `x_1, ..., x_n` are the elements of this $coll.
+ * where `x,,1,,, ..., x,,n,,` are the elements of this $coll.
*/
def :\ [B](z: B)(op: (A, B) => B): B = foldRight(z)(op)
@@ -507,9 +557,9 @@ self =>
* @return the result of inserting `op` between consecutive elements of this $coll$,
* going left to right:
* {{{
- * op(...(op(x_1, x_2), ... ) , x_n)
+ * op(...(op(x,,1,,, x,,2,,), ... ) , x,,n,,)
* }}}
- * where `x_1, ..., x_n` are the elements of this $coll.
+ * where `x,,1,,, ..., x,,n,,` are the elements of this $coll.
* @throws `UnsupportedOperationException` if this $coll is empty.
*/
def reduceLeft[B >: A](op: (B, A) => B): B = {
@@ -544,9 +594,9 @@ self =>
* @return the result of inserting `op` between consecutive elements of this $coll$,
* going right to left:
* {{{
- * op(x_1, op(x_2, ..., op(x_(n-1), x_n)...))
+ * op(x,,1,,, op(x,,2,,, ..., op(x,,n-1,,, x,,n,,)...))
* }}}
- * where `x_1, ..., x_n` are the elements of this $coll.
+ * where `x,,1,,, ..., x,,n,,` are the elements of this $coll.
* @throws `UnsupportedOperationException` if this $coll is empty.
*/
def reduceRight[B >: A](op: (A, B) => B): B = {
@@ -576,9 +626,13 @@ self =>
* @tparam B the result type of the `+` operator.
* @return the sum of all elements of this $coll with respect to the `+` operator in `num`.
*
- * @usage sum: Num
- * @return the sum of all elements in this $coll of numbers of type `Num`.
- * `Num` must be a numeric type such as `Int`, `Double`, `BigDecimal`.
+ * @usecase def sum: Int
+ *
+ * @return the sum of all elements in this $coll of numbers of type `Int`.
+ * Instead of `Int`, any other type `T` with an implicit `Numeric[T]` implementation
+ * can be used as element type of the $coll and as result type of `sum`.
+ * Examples of such types are: `Long`, `Float`, `Double`, `BigInt`.
+ *
*/
def sum[B >: A](implicit num: Numeric[B]): B = {
var acc = num.zero
@@ -593,9 +647,12 @@ self =>
* @tparam B the result type of the `*` operator.
* @return the product of all elements of this $coll with respect to the `*` operator in `num`.
*
- * @usage product: Num
- * @return the product of all elements in this $coll of numbers of type `Num`.
- * `Num` must be a numeric type such as `Int`, `Double`, `BigDecimal`.
+ * @usecase def product: Int
+ *
+ * @return the product of all elements in this $coll of numbers of type `Int`.
+ * Instead of `Int`, any other type `T` with an implicit `Numeric[T]` implementation
+ * can be used as element type of the $coll and as result type of `product`.
+ * Examples of such types are: `Long`, `Float`, `Double`, `BigInt`.
*/
def product[B >: A](implicit num: Numeric[B]): B = {
var acc = num.one
@@ -609,7 +666,7 @@ self =>
* @tparam B The type over which the ordering is defined.
* @return the smallest element of this $coll with respect to the ordering `cmp`.
*
- * @usage min: A
+ * @usecase def min: A
* @return the smallest element of this $coll
*/
def min[B >: A](implicit cmp: Ordering[B]): A = {
@@ -626,7 +683,7 @@ self =>
* @tparam B The type over which the ordering is defined.
* @return the largest element of this $coll with respect to the ordering `cmp`.
*
- * @usage min: A
+ * @usecase def min: A
* @return the largest element of this $coll.
*/
def max[B >: A](implicit cmp: Ordering[B]): A = {
@@ -861,7 +918,7 @@ self =>
* @tparam B the type of the elements of the array.
*
*
- * @usage copyToArray(xs: Array[A], start: Int, len: Int): Unit
+ * @usecase def copyToArray(xs: Array[A], start: Int, len: Int): Unit
*
* @param xs the array to fill.
* @param start the starting index.
@@ -891,7 +948,7 @@ self =>
* @param start the starting index.
* @tparam B the type of the elements of the array.
*
- * @usage def copyToArray(xs: Array[A], start: Int): Unit
+ * @usecase def copyToArray(xs: Array[A], start: Int): Unit
*
* @param xs the array to fill.
* @param start the starting index.
@@ -907,7 +964,7 @@ self =>
* be available.
* @return an array containing all elements of this $coll.
*
- * @usage toArray: Array[A]
+ * @usecase def toArray: Array[A]
* @return an array containing all elements of this $coll.
* A `ClassManifest` must be available for the element type of this $coll.
*/
@@ -1054,7 +1111,6 @@ self =>
/** Creates a non-strict view of this $coll.
*
* @return a non-strict view of this $coll.
- * @see TraversableView
*/
def view = new TraversableView[A, Repr] {
protected lazy val underlying = self.repr
@@ -1107,7 +1163,7 @@ self =>
* `f` to each element of the outer $coll that satisfies predicate `p`
* and collecting the results.
*
- * @usage def map[B](f: A => B): $Coll[B]
+ * @usecase def map[B](f: A => B): $Coll[B]
*
* @param f the function to apply to each element.
* @tparam B the element type of the returned collection.
@@ -1132,7 +1188,7 @@ self =>
* @return a new collection of type `That` resulting from applying the given collection-valued function
* `f` to each element of the outer $coll that satisfies predicate `p` and concatenating the results.
*
- * @usage def flatMap[B](f: A => Traversable[B]): $Coll[B]
+ * @usecase def flatMap[B](f: A => Traversable[B]): $Coll[B]
*
* @param f the function to apply to each element.
* @tparam B the element type of the returned collection.
@@ -1156,7 +1212,7 @@ self =>
* This result will always be ignored. Typically `U` is `Unit`,
* but this is not necessary.
*
- * @usage def foreach(f: A => Unit): Unit
+ * @usecase def foreach(f: A => Unit): Unit
*
* @param f the function that is applied for its side-effect to every element.
* The result of function `f` is discarded.
diff --git a/src/library/scala/collection/mutable/MapLike.scala b/src/library/scala/collection/mutable/MapLike.scala
index d03858a68f..92f1b5bba6 100644
--- a/src/library/scala/collection/mutable/MapLike.scala
+++ b/src/library/scala/collection/mutable/MapLike.scala
@@ -103,6 +103,15 @@ trait MapLike[A, B, +This <: MapLike[A, B, This] with Map[A, B]]
*/
override def updated[B1 >: B](key: A, value: B1): mutable.Map[A, B1] = this + ((key, value))
+ /** If given key is already in this map, returns associated value
+ * Otherwise, computes value from given expression `op`, stores with key
+ * in map and returns that value.
+ */
+ def cached(key: A, op: => B) = get(key) match {
+ case Some(v) => v
+ case None => val v = op; update(key, v); v
+ }
+
/** Add a new key/value mapping and return the map itself.
*
* @param kv the key/value mapping to be added