File modules/editor/codemirror/mode/clike/scala.html

Last commit: Sun Dec 17 01:14:09 2017 +0100	Jan Dankert	Integration eines weiteren Code-Editors: Codemirror. Demnächst müssen wir hier mal aufräumen und andere Editoren rauswerfen.
1 <!doctype html> 2 3 <title>CodeMirror: Scala mode</title> 4 <meta charset="utf-8"/> 5 <link rel=stylesheet href="../../doc/docs.css"> 6 7 <link rel="stylesheet" href="../../lib/codemirror.css"> 8 <link rel="stylesheet" href="../../theme/ambiance.css"> 9 <script src="../../lib/codemirror.js"></script> 10 <script src="../../addon/edit/matchbrackets.js"></script> 11 <script src="clike.js"></script> 12 <div id=nav> 13 <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a> 14 15 <ul> 16 <li><a href="../../index.html">Home</a> 17 <li><a href="../../doc/manual.html">Manual</a> 18 <li><a href="https://github.com/codemirror/codemirror">Code</a> 19 </ul> 20 <ul> 21 <li><a href="../index.html">Language modes</a> 22 <li><a class=active href="#">Scala</a> 23 </ul> 24 </div> 25 26 <article> 27 <h2>Scala mode</h2> 28 <form> 29 <textarea id="code" name="code"> 30 31 /* __ *\ 32 ** ________ ___ / / ___ Scala API ** 33 ** / __/ __// _ | / / / _ | (c) 2003-2011, LAMP/EPFL ** 34 ** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** 35 ** /____/\___/_/ |_/____/_/ | | ** 36 ** |/ ** 37 \* */ 38 39 package scala.collection 40 41 import generic._ 42 import mutable.{ Builder, ListBuffer } 43 import annotation.{tailrec, migration, bridge} 44 import annotation.unchecked.{ uncheckedVariance => uV } 45 import parallel.ParIterable 46 47 /** A template trait for traversable collections of type `Traversable[A]`. 48 * 49 * $traversableInfo 50 * @define mutability 51 * @define traversableInfo 52 * This is a base trait of all kinds of $mutability Scala collections. It 53 * implements the behavior common to all collections, in terms of a method 54 * `foreach` with signature: 55 * {{{ 56 * def foreach[U](f: Elem => U): Unit 57 * }}} 58 * Collection classes mixing in this trait provide a concrete 59 * `foreach` method which traverses all the 60 * elements contained in the collection, applying a given function to each. 61 * They also need to provide a method `newBuilder` 62 * which creates a builder for collections of the same kind. 63 * 64 * A traversable class might or might not have two properties: strictness 65 * and orderedness. Neither is represented as a type. 66 * 67 * The instances of a strict collection class have all their elements 68 * computed before they can be used as values. By contrast, instances of 69 * a non-strict collection class may defer computation of some of their 70 * elements until after the instance is available as a value. 71 * A typical example of a non-strict collection class is a 72 * <a href="../immutable/Stream.html" target="ContentFrame"> 73 * `scala.collection.immutable.Stream`</a>. 74 * A more general class of examples are `TraversableViews`. 75 * 76 * If a collection is an instance of an ordered collection class, traversing 77 * its elements with `foreach` will always visit elements in the 78 * same order, even for different runs of the program. If the class is not 79 * ordered, `foreach` can visit elements in different orders for 80 * different runs (but it will keep the same order in the same run).' 81 * 82 * A typical example of a collection class which is not ordered is a 83 * `HashMap` of objects. The traversal order for hash maps will 84 * depend on the hash codes of its elements, and these hash codes might 85 * differ from one run to the next. By contrast, a `LinkedHashMap` 86 * is ordered because it's `foreach` method visits elements in the 87 * order they were inserted into the `HashMap`. 88 * 89 * @author Martin Odersky 90 * @version 2.8 91 * @since 2.8 92 * @tparam A the element type of the collection 93 * @tparam Repr the type of the actual collection containing the elements. 94 * 95 * @define Coll Traversable 96 * @define coll traversable collection 97 */ 98 trait TraversableLike[+A, +Repr] extends HasNewBuilder[A, Repr] 99 with FilterMonadic[A, Repr] 100 with TraversableOnce[A] 101 with GenTraversableLike[A, Repr] 102 with Parallelizable[A, ParIterable[A]] 103 { 104 self => 105 106 import Traversable.breaks._ 107 108 /** The type implementing this traversable */ 109 protected type Self = Repr 110 111 /** The collection of type $coll underlying this `TraversableLike` object. 112 * By default this is implemented as the `TraversableLike` object itself, 113 * but this can be overridden. 114 */ 115 def repr: Repr = this.asInstanceOf[Repr] 116 117 /** The underlying collection seen as an instance of `$Coll`. 118 * By default this is implemented as the current collection object itself, 119 * but this can be overridden. 120 */ 121 protected[this] def thisCollection: Traversable[A] = this.asInstanceOf[Traversable[A]] 122 123 /** A conversion from collections of type `Repr` to `$Coll` objects. 124 * By default this is implemented as just a cast, but this can be overridden. 125 */ 126 protected[this] def toCollection(repr: Repr): Traversable[A] = repr.asInstanceOf[Traversable[A]] 127 128 /** Creates a new builder for this collection type. 129 */ 130 protected[this] def newBuilder: Builder[A, Repr] 131 132 protected[this] def parCombiner = ParIterable.newCombiner[A] 133 134 /** Applies a function `f` to all elements of this $coll. 135 * 136 * Note: this method underlies the implementation of most other bulk operations. 137 * It's important to implement this method in an efficient way. 138 * 139 * 140 * @param f the function that is applied for its side-effect to every element. 141 * The result of function `f` is discarded. 142 * 143 * @tparam U the type parameter describing the result of function `f`. 144 * This result will always be ignored. Typically `U` is `Unit`, 145 * but this is not necessary. 146 * 147 * @usecase def foreach(f: A => Unit): Unit 148 */ 149 def foreach[U](f: A => U): Unit 150 151 /** Tests whether this $coll is empty. 152 * 153 * @return `true` if the $coll contain no elements, `false` otherwise. 154 */ 155 def isEmpty: Boolean = { 156 var result = true 157 breakable { 158 for (x <- this) { 159 result = false 160 break 161 } 162 } 163 result 164 } 165 166 /** Tests whether this $coll is known to have a finite size. 167 * All strict collections are known to have finite size. For a non-strict collection 168 * such as `Stream`, the predicate returns `true` if all elements have been computed. 169 * It returns `false` if the stream is not yet evaluated to the end. 170 * 171 * Note: many collection methods will not work on collections of infinite sizes. 172 * 173 * @return `true` if this collection is known to have finite size, `false` otherwise. 174 */ 175 def hasDefiniteSize = true 176 177 def ++[B >: A, That](that: GenTraversableOnce[B])(implicit bf: CanBuildFrom[Repr, B, That]): That = { 178 val b = bf(repr) 179 if (that.isInstanceOf[IndexedSeqLike[_, _]]) b.sizeHint(this, that.seq.size) 180 b ++= thisCollection 181 b ++= that.seq 182 b.result 183 } 184 185 @bridge 186 def ++[B >: A, That](that: TraversableOnce[B])(implicit bf: CanBuildFrom[Repr, B, That]): That = 187 ++(that: GenTraversableOnce[B])(bf) 188 189 /** Concatenates this $coll with the elements of a traversable collection. 190 * It differs from ++ in that the right operand determines the type of the 191 * resulting collection rather than the left one. 192 * 193 * @param that the traversable to append. 194 * @tparam B the element type of the returned collection. 195 * @tparam That $thatinfo 196 * @param bf $bfinfo 197 * @return a new collection of type `That` which contains all elements 198 * of this $coll followed by all elements of `that`. 199 * 200 * @usecase def ++:[B](that: TraversableOnce[B]): $Coll[B] 201 * 202 * @return a new $coll which contains all elements of this $coll 203 * followed by all elements of `that`. 204 */ 205 def ++:[B >: A, That](that: TraversableOnce[B])(implicit bf: CanBuildFrom[Repr, B, That]): That = { 206 val b = bf(repr) 207 if (that.isInstanceOf[IndexedSeqLike[_, _]]) b.sizeHint(this, that.size) 208 b ++= that 209 b ++= thisCollection 210 b.result 211 } 212 213 /** This overload exists because: for the implementation of ++: we should reuse 214 * that of ++ because many collections override it with more efficient versions. 215 * Since TraversableOnce has no '++' method, we have to implement that directly, 216 * but Traversable and down can use the overload. 217 */ 218 def ++:[B >: A, That](that: Traversable[B])(implicit bf: CanBuildFrom[Repr, B, That]): That = 219 (that ++ seq)(breakOut) 220 221 def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That = { 222 val b = bf(repr) 223 b.sizeHint(this) 224 for (x <- this) b += f(x) 225 b.result 226 } 227 228 def flatMap[B, That](f: A => GenTraversableOnce[B])(implicit bf: CanBuildFrom[Repr, B, That]): That = { 229 val b = bf(repr) 230 for (x <- this) b ++= f(x).seq 231 b.result 232 } 233 234 /** Selects all elements of this $coll which satisfy a predicate. 235 * 236 * @param p the predicate used to test elements. 237 * @return a new $coll consisting of all elements of this $coll that satisfy the given 238 * predicate `p`. The order of the elements is preserved. 239 */ 240 def filter(p: A => Boolean): Repr = { 241 val b = newBuilder 242 for (x <- this) 243 if (p(x)) b += x 244 b.result 245 } 246 247 /** Selects all elements of this $coll which do not satisfy a predicate. 248 * 249 * @param p the predicate used to test elements. 250 * @return a new $coll consisting of all elements of this $coll that do not satisfy the given 251 * predicate `p`. The order of the elements is preserved. 252 */ 253 def filterNot(p: A => Boolean): Repr = filter(!p(_)) 254 255 def collect[B, That](pf: PartialFunction[A, B])(implicit bf: CanBuildFrom[Repr, B, That]): That = { 256 val b = bf(repr) 257 for (x <- this) if (pf.isDefinedAt(x)) b += pf(x) 258 b.result 259 } 260 261 /** Builds a new collection by applying an option-valued function to all 262 * elements of this $coll on which the function is defined. 263 * 264 * @param f the option-valued function which filters and maps the $coll. 265 * @tparam B the element type of the returned collection. 266 * @tparam That $thatinfo 267 * @param bf $bfinfo 268 * @return a new collection of type `That` resulting from applying the option-valued function 269 * `f` to each element and collecting all defined results. 270 * The order of the elements is preserved. 271 * 272 * @usecase def filterMap[B](f: A => Option[B]): $Coll[B] 273 * 274 * @param pf the partial function which filters and maps the $coll. 275 * @return a new $coll resulting from applying the given option-valued function 276 * `f` to each element and collecting all defined results. 277 * The order of the elements is preserved. 278 def filterMap[B, That](f: A => Option[B])(implicit bf: CanBuildFrom[Repr, B, That]): That = { 279 val b = bf(repr) 280 for (x <- this) 281 f(x) match { 282 case Some(y) => b += y 283 case _ => 284 } 285 b.result 286 } 287 */ 288 289 /** Partitions this $coll in two ${coll}s according to a predicate. 290 * 291 * @param p the predicate on which to partition. 292 * @return a pair of ${coll}s: the first $coll consists of all elements that 293 * satisfy the predicate `p` and the second $coll consists of all elements 294 * that don't. The relative order of the elements in the resulting ${coll}s 295 * is the same as in the original $coll. 296 */ 297 def partition(p: A => Boolean): (Repr, Repr) = { 298 val l, r = newBuilder 299 for (x <- this) (if (p(x)) l else r) += x 300 (l.result, r.result) 301 } 302 303 def groupBy[K](f: A => K): immutable.Map[K, Repr] = { 304 val m = mutable.Map.empty[K, Builder[A, Repr]] 305 for (elem <- this) { 306 val key = f(elem) 307 val bldr = m.getOrElseUpdate(key, newBuilder) 308 bldr += elem 309 } 310 val b = immutable.Map.newBuilder[K, Repr] 311 for ((k, v) <- m) 312 b += ((k, v.result)) 313 314 b.result 315 } 316 317 /** Tests whether a predicate holds for all elements of this $coll. 318 * 319 * $mayNotTerminateInf 320 * 321 * @param p the predicate used to test elements. 322 * @return `true` if the given predicate `p` holds for all elements 323 * of this $coll, otherwise `false`. 324 */ 325 def forall(p: A => Boolean): Boolean = { 326 var result = true 327 breakable { 328 for (x <- this) 329 if (!p(x)) { result = false; break } 330 } 331 result 332 } 333 334 /** Tests whether a predicate holds for some of the elements of this $coll. 335 * 336 * $mayNotTerminateInf 337 * 338 * @param p the predicate used to test elements. 339 * @return `true` if the given predicate `p` holds for some of the 340 * elements of this $coll, otherwise `false`. 341 */ 342 def exists(p: A => Boolean): Boolean = { 343 var result = false 344 breakable { 345 for (x <- this) 346 if (p(x)) { result = true; break } 347 } 348 result 349 } 350 351 /** Finds the first element of the $coll satisfying a predicate, if any. 352 * 353 * $mayNotTerminateInf 354 * $orderDependent 355 * 356 * @param p the predicate used to test elements. 357 * @return an option value containing the first element in the $coll 358 * that satisfies `p`, or `None` if none exists. 359 */ 360 def find(p: A => Boolean): Option[A] = { 361 var result: Option[A] = None 362 breakable { 363 for (x <- this) 364 if (p(x)) { result = Some(x); break } 365 } 366 result 367 } 368 369 def scan[B >: A, That](z: B)(op: (B, B) => B)(implicit cbf: CanBuildFrom[Repr, B, That]): That = scanLeft(z)(op) 370 371 def scanLeft[B, That](z: B)(op: (B, A) => B)(implicit bf: CanBuildFrom[Repr, B, That]): That = { 372 val b = bf(repr) 373 b.sizeHint(this, 1) 374 var acc = z 375 b += acc 376 for (x <- this) { acc = op(acc, x); b += acc } 377 b.result 378 } 379 380 @migration(2, 9, 381 "This scanRight definition has changed in 2.9.\n" + 382 "The previous behavior can be reproduced with scanRight.reverse." 383 ) 384 def scanRight[B, That](z: B)(op: (A, B) => B)(implicit bf: CanBuildFrom[Repr, B, That]): That = { 385 var scanned = List(z) 386 var acc = z 387 for (x <- reversed) { 388 acc = op(x, acc) 389 scanned ::= acc 390 } 391 val b = bf(repr) 392 for (elem <- scanned) b += elem 393 b.result 394 } 395 396 /** Selects the first element of this $coll. 397 * $orderDependent 398 * @return the first element of this $coll. 399 * @throws `NoSuchElementException` if the $coll is empty. 400 */ 401 def head: A = { 402 var result: () => A = () => throw new NoSuchElementException 403 breakable { 404 for (x <- this) { 405 result = () => x 406 break 407 } 408 } 409 result() 410 } 411 412 /** Optionally selects the first element. 413 * $orderDependent 414 * @return the first element of this $coll if it is nonempty, `None` if it is empty. 415 */ 416 def headOption: Option[A] = if (isEmpty) None else Some(head) 417 418 /** Selects all elements except the first. 419 * $orderDependent 420 * @return a $coll consisting of all elements of this $coll 421 * except the first one. 422 * @throws `UnsupportedOperationException` if the $coll is empty. 423 */ 424 override def tail: Repr = { 425 if (isEmpty) throw new UnsupportedOperationException("empty.tail") 426 drop(1) 427 } 428 429 /** Selects the last element. 430 * $orderDependent 431 * @return The last element of this $coll. 432 * @throws NoSuchElementException If the $coll is empty. 433 */ 434 def last: A = { 435 var lst = head 436 for (x <- this) 437 lst = x 438 lst 439 } 440 441 /** Optionally selects the last element. 442 * $orderDependent 443 * @return the last element of this $coll$ if it is nonempty, `None` if it is empty. 444 */ 445 def lastOption: Option[A] = if (isEmpty) None else Some(last) 446 447 /** Selects all elements except the last. 448 * $orderDependent 449 * @return a $coll consisting of all elements of this $coll 450 * except the last one. 451 * @throws `UnsupportedOperationException` if the $coll is empty. 452 */ 453 def init: Repr = { 454 if (isEmpty) throw new UnsupportedOperationException("empty.init") 455 var lst = head 456 var follow = false 457 val b = newBuilder 458 b.sizeHint(this, -1) 459 for (x <- this.seq) { 460 if (follow) b += lst 461 else follow = true 462 lst = x 463 } 464 b.result 465 } 466 467 def take(n: Int): Repr = slice(0, n) 468 469 def drop(n: Int): Repr = 470 if (n <= 0) { 471 val b = newBuilder 472 b.sizeHint(this) 473 b ++= thisCollection result 474 } 475 else sliceWithKnownDelta(n, Int.MaxValue, -n) 476 477 def slice(from: Int, until: Int): Repr = sliceWithKnownBound(math.max(from, 0), until) 478 479 // Precondition: from >= 0, until > 0, builder already configured for building. 480 private[this] def sliceInternal(from: Int, until: Int, b: Builder[A, Repr]): Repr = { 481 var i = 0 482 breakable { 483 for (x <- this.seq) { 484 if (i >= from) b += x 485 i += 1 486 if (i >= until) break 487 } 488 } 489 b.result 490 } 491 // Precondition: from >= 0 492 private[scala] def sliceWithKnownDelta(from: Int, until: Int, delta: Int): Repr = { 493 val b = newBuilder 494 if (until <= from) b.result 495 else { 496 b.sizeHint(this, delta) 497 sliceInternal(from, until, b) 498 } 499 } 500 // Precondition: from >= 0 501 private[scala] def sliceWithKnownBound(from: Int, until: Int): Repr = { 502 val b = newBuilder 503 if (until <= from) b.result 504 else { 505 b.sizeHintBounded(until - from, this) 506 sliceInternal(from, until, b) 507 } 508 } 509 510 def takeWhile(p: A => Boolean): Repr = { 511 val b = newBuilder 512 breakable { 513 for (x <- this) { 514 if (!p(x)) break 515 b += x 516 } 517 } 518 b.result 519 } 520 521 def dropWhile(p: A => Boolean): Repr = { 522 val b = newBuilder 523 var go = false 524 for (x <- this) { 525 if (!p(x)) go = true 526 if (go) b += x 527 } 528 b.result 529 } 530 531 def span(p: A => Boolean): (Repr, Repr) = { 532 val l, r = newBuilder 533 var toLeft = true 534 for (x <- this) { 535 toLeft = toLeft && p(x) 536 (if (toLeft) l else r) += x 537 } 538 (l.result, r.result) 539 } 540 541 def splitAt(n: Int): (Repr, Repr) = { 542 val l, r = newBuilder 543 l.sizeHintBounded(n, this) 544 if (n >= 0) r.sizeHint(this, -n) 545 var i = 0 546 for (x <- this) { 547 (if (i < n) l else r) += x 548 i += 1 549 } 550 (l.result, r.result) 551 } 552 553 /** Iterates over the tails of this $coll. The first value will be this 554 * $coll and the final one will be an empty $coll, with the intervening 555 * values the results of successive applications of `tail`. 556 * 557 * @return an iterator over all the tails of this $coll 558 * @example `List(1,2,3).tails = Iterator(List(1,2,3), List(2,3), List(3), Nil)` 559 */ 560 def tails: Iterator[Repr] = iterateUntilEmpty(_.tail) 561 562 /** Iterates over the inits of this $coll. The first value will be this 563 * $coll and the final one will be an empty $coll, with the intervening 564 * values the results of successive applications of `init`. 565 * 566 * @return an iterator over all the inits of this $coll 567 * @example `List(1,2,3).inits = Iterator(List(1,2,3), List(1,2), List(1), Nil)` 568 */ 569 def inits: Iterator[Repr] = iterateUntilEmpty(_.init) 570 571 /** Copies elements of this $coll to an array. 572 * Fills the given array `xs` with at most `len` elements of 573 * this $coll, starting at position `start`. 574 * Copying will stop once either the end of the current $coll is reached, 575 * or the end of the array is reached, or `len` elements have been copied. 576 * 577 * $willNotTerminateInf 578 * 579 * @param xs the array to fill. 580 * @param start the starting index. 581 * @param len the maximal number of elements to copy. 582 * @tparam B the type of the elements of the array. 583 * 584 * 585 * @usecase def copyToArray(xs: Array[A], start: Int, len: Int): Unit 586 */ 587 def copyToArray[B >: A](xs: Array[B], start: Int, len: Int) { 588 var i = start 589 val end = (start + len) min xs.length 590 breakable { 591 for (x <- this) { 592 if (i >= end) break 593 xs(i) = x 594 i += 1 595 } 596 } 597 } 598 599 def toTraversable: Traversable[A] = thisCollection 600 def toIterator: Iterator[A] = toStream.iterator 601 def toStream: Stream[A] = toBuffer.toStream 602 603 /** Converts this $coll to a string. 604 * 605 * @return a string representation of this collection. By default this 606 * string consists of the `stringPrefix` of this $coll, 607 * followed by all elements separated by commas and enclosed in parentheses. 608 */ 609 override def toString = mkString(stringPrefix + "(", ", ", ")") 610 611 /** Defines the prefix of this object's `toString` representation. 612 * 613 * @return a string representation which starts the result of `toString` 614 * applied to this $coll. By default the string prefix is the 615 * simple name of the collection class $coll. 616 */ 617 def stringPrefix : String = { 618 var string = repr.asInstanceOf[AnyRef].getClass.getName 619 val idx1 = string.lastIndexOf('.' : Int) 620 if (idx1 != -1) string = string.substring(idx1 + 1) 621 val idx2 = string.indexOf('$') 622 if (idx2 != -1) string = string.substring(0, idx2) 623 string 624 } 625 626 /** Creates a non-strict view of this $coll. 627 * 628 * @return a non-strict view of this $coll. 629 */ 630 def view = new TraversableView[A, Repr] { 631 protected lazy val underlying = self.repr 632 override def foreach[U](f: A => U) = self foreach f 633 } 634 635 /** Creates a non-strict view of a slice of this $coll. 636 * 637 * Note: the difference between `view` and `slice` is that `view` produces 638 * a view of the current $coll, whereas `slice` produces a new $coll. 639 * 640 * Note: `view(from, to)` is equivalent to `view.slice(from, to)` 641 * $orderDependent 642 * 643 * @param from the index of the first element of the view 644 * @param until the index of the element following the view 645 * @return a non-strict view of a slice of this $coll, starting at index `from` 646 * and extending up to (but not including) index `until`. 647 */ 648 def view(from: Int, until: Int): TraversableView[A, Repr] = view.slice(from, until) 649 650 /** Creates a non-strict filter of this $coll. 651 * 652 * Note: the difference between `c filter p` and `c withFilter p` is that 653 * the former creates a new collection, whereas the latter only 654 * restricts the domain of subsequent `map`, `flatMap`, `foreach`, 655 * and `withFilter` operations. 656 * $orderDependent 657 * 658 * @param p the predicate used to test elements. 659 * @return an object of class `WithFilter`, which supports 660 * `map`, `flatMap`, `foreach`, and `withFilter` operations. 661 * All these operations apply to those elements of this $coll which 662 * satisfy the predicate `p`. 663 */ 664 def withFilter(p: A => Boolean): FilterMonadic[A, Repr] = new WithFilter(p) 665 666 /** A class supporting filtered operations. Instances of this class are 667 * returned by method `withFilter`. 668 */ 669 class WithFilter(p: A => Boolean) extends FilterMonadic[A, Repr] { 670 671 /** Builds a new collection by applying a function to all elements of the 672 * outer $coll containing this `WithFilter` instance that satisfy predicate `p`. 673 * 674 * @param f the function to apply to each element. 675 * @tparam B the element type of the returned collection. 676 * @tparam That $thatinfo 677 * @param bf $bfinfo 678 * @return a new collection of type `That` resulting from applying 679 * the given function `f` to each element of the outer $coll 680 * that satisfies predicate `p` and collecting the results. 681 * 682 * @usecase def map[B](f: A => B): $Coll[B] 683 * 684 * @return a new $coll resulting from applying the given function 685 * `f` to each element of the outer $coll that satisfies 686 * predicate `p` and collecting the results. 687 */ 688 def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That = { 689 val b = bf(repr) 690 for (x <- self) 691 if (p(x)) b += f(x) 692 b.result 693 } 694 695 /** Builds a new collection by applying a function to all elements of the 696 * outer $coll containing this `WithFilter` instance that satisfy 697 * predicate `p` and concatenating the results. 698 * 699 * @param f the function to apply to each element. 700 * @tparam B the element type of the returned collection. 701 * @tparam That $thatinfo 702 * @param bf $bfinfo 703 * @return a new collection of type `That` resulting from applying 704 * the given collection-valued function `f` to each element 705 * of the outer $coll that satisfies predicate `p` and 706 * concatenating the results. 707 * 708 * @usecase def flatMap[B](f: A => TraversableOnce[B]): $Coll[B] 709 * 710 * @return a new $coll resulting from applying the given collection-valued function 711 * `f` to each element of the outer $coll that satisfies predicate `p` and concatenating the results. 712 */ 713 def flatMap[B, That](f: A => GenTraversableOnce[B])(implicit bf: CanBuildFrom[Repr, B, That]): That = { 714 val b = bf(repr) 715 for (x <- self) 716 if (p(x)) b ++= f(x).seq 717 b.result 718 } 719 720 /** Applies a function `f` to all elements of the outer $coll containing 721 * this `WithFilter` instance that satisfy predicate `p`. 722 * 723 * @param f the function that is applied for its side-effect to every element. 724 * The result of function `f` is discarded. 725 * 726 * @tparam U the type parameter describing the result of function `f`. 727 * This result will always be ignored. Typically `U` is `Unit`, 728 * but this is not necessary. 729 * 730 * @usecase def foreach(f: A => Unit): Unit 731 */ 732 def foreach[U](f: A => U): Unit = 733 for (x <- self) 734 if (p(x)) f(x) 735 736 /** Further refines the filter for this $coll. 737 * 738 * @param q the predicate used to test elements. 739 * @return an object of class `WithFilter`, which supports 740 * `map`, `flatMap`, `foreach`, and `withFilter` operations. 741 * All these operations apply to those elements of this $coll which 742 * satisfy the predicate `q` in addition to the predicate `p`. 743 */ 744 def withFilter(q: A => Boolean): WithFilter = 745 new WithFilter(x => p(x) && q(x)) 746 } 747 748 // A helper for tails and inits. 749 private def iterateUntilEmpty(f: Traversable[A @uV] => Traversable[A @uV]): Iterator[Repr] = { 750 val it = Iterator.iterate(thisCollection)(f) takeWhile (x => !x.isEmpty) 751 it ++ Iterator(Nil) map (newBuilder ++= _ result) 752 } 753 } 754 755 756 </textarea> 757 </form> 758 759 <script> 760 var editor = CodeMirror.fromTextArea(document.getElementById("code"), { 761 lineNumbers: true, 762 matchBrackets: true, 763 theme: "ambiance", 764 mode: "text/x-scala" 765 }); 766 </script> 767 </article>
Download modules/editor/codemirror/mode/clike/scala.html
History Sun, 17 Dec 2017 01:14:09 +0100 Jan Dankert Integration eines weiteren Code-Editors: Codemirror. Demnächst müssen wir hier mal aufräumen und andere Editoren rauswerfen.