diff options
author | Martin Odersky <odersky@gmail.com> | 2009-12-07 17:31:49 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2009-12-07 17:31:49 +0000 |
commit | 1e88594f358d08b5e9b22ba87280003a581359e4 (patch) | |
tree | e68b6d1095ff1b1345e86d8a67c1f874849a31ff /src/library | |
parent | de1d172a15e20ec7e96d96d5cea5cb41162b9f75 (diff) | |
download | scala-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.scala | 13 | ||||
-rw-r--r-- | src/library/scala/collection/IterableLike.scala | 333 | ||||
-rw-r--r-- | src/library/scala/collection/Iterator.scala | 15 | ||||
-rw-r--r-- | src/library/scala/collection/LinearSeqLike.scala | 12 | ||||
-rw-r--r-- | src/library/scala/collection/MapLike.scala | 40 | ||||
-rw-r--r-- | src/library/scala/collection/SeqLike.scala | 325 | ||||
-rw-r--r-- | src/library/scala/collection/TraversableLike.scala | 150 | ||||
-rw-r--r-- | src/library/scala/collection/mutable/MapLike.scala | 9 |
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 > 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 < 0</code> iff <code>this.length < len</code> - * <code>x == 0</code> iff <code>this.length == len</code> - * <code>x > 0</code> iff <code>this.length > 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 |