| OLD | NEW |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 part of dart.core; | 5 part of dart.core; |
| 6 | 6 |
| 7 /** | 7 /** |
| 8 * The [Iterable] interface allows to get an [Iterator] out of an | 8 * The [Iterable] interface allows to get an [Iterator] out of an |
| 9 * [Iterable] object. | 9 * [Iterable] object. |
| 10 * | 10 * |
| (...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 366 } | 366 } |
| 367 throw new RangeError.value(index); | 367 throw new RangeError.value(index); |
| 368 } | 368 } |
| 369 } | 369 } |
| 370 | 370 |
| 371 typedef T _Transformation<S, T>(S value); | 371 typedef T _Transformation<S, T>(S value); |
| 372 | 372 |
| 373 class MappedIterable<S, T> extends Iterable<T> { | 373 class MappedIterable<S, T> extends Iterable<T> { |
| 374 final Iterable<S> _iterable; | 374 final Iterable<S> _iterable; |
| 375 // TODO(ahe): Restore type when feature is implemented in dart2js | 375 // TODO(ahe): Restore type when feature is implemented in dart2js |
| 376 // checked mode. | 376 // checked mode. http://dartbug.com/7733 |
| 377 final /* _Transformation<S, T> */ _f; | 377 final /* _Transformation<S, T> */ _f; |
| 378 | 378 |
| 379 MappedIterable(this._iterable, T this._f(S element)); | 379 MappedIterable(this._iterable, T this._f(S element)); |
| 380 | 380 |
| 381 Iterator<T> get iterator => new MappedIterator<S, T>(_iterable.iterator, _f); | 381 Iterator<T> get iterator => new MappedIterator<S, T>(_iterable.iterator, _f); |
| 382 | 382 |
| 383 // Length related functions are independent of the mapping. | 383 // Length related functions are independent of the mapping. |
| 384 int get length => _iterable.length; | 384 int get length => _iterable.length; |
| 385 bool get isEmpty => _iterable.isEmpty; | 385 bool get isEmpty => _iterable.isEmpty; |
| 386 } | 386 } |
| 387 | 387 |
| 388 class MappedIterator<S, T> extends Iterator<T> { | 388 class MappedIterator<S, T> extends Iterator<T> { |
| 389 T _current; | 389 T _current; |
| 390 final Iterator<S> _iterator; | 390 final Iterator<S> _iterator; |
| 391 // TODO(ahe): Restore type when feature is implemented in dart2js | 391 // TODO(ahe): Restore type when feature is implemented in dart2js |
| 392 // checked mode. | 392 // checked mode. http://dartbug.com/7733 |
| 393 final /* _Transformation<S, T> */ _f; | 393 final /* _Transformation<S, T> */ _f; |
| 394 | 394 |
| 395 MappedIterator(this._iterator, T this._f(S element)); | 395 MappedIterator(this._iterator, T this._f(S element)); |
| 396 | 396 |
| 397 bool moveNext() { | 397 bool moveNext() { |
| 398 if (_iterator.moveNext()) { | 398 if (_iterator.moveNext()) { |
| 399 _current = _f(_iterator.current); | 399 _current = _f(_iterator.current); |
| 400 return true; | 400 return true; |
| 401 } else { | 401 } else { |
| 402 _current = null; | 402 _current = null; |
| 403 return false; | 403 return false; |
| 404 } | 404 } |
| 405 } | 405 } |
| 406 | 406 |
| 407 T get current => _current; | 407 T get current => _current; |
| 408 } | 408 } |
| 409 | 409 |
| 410 typedef bool _ElementPredicate<E>(E element); | 410 typedef bool _ElementPredicate<E>(E element); |
| 411 | 411 |
| 412 class WhereIterable<E> extends Iterable<E> { | 412 class WhereIterable<E> extends Iterable<E> { |
| 413 final Iterable<E> _iterable; | 413 final Iterable<E> _iterable; |
| 414 final _ElementPredicate _f; | 414 // TODO(ahe): Restore type when feature is implemented in dart2js |
| 415 // checked mode. http://dartbug.com/7733 |
| 416 final /* _ElementPredicate */ _f; |
| 415 | 417 |
| 416 WhereIterable(this._iterable, bool this._f(E element)); | 418 WhereIterable(this._iterable, bool this._f(E element)); |
| 417 | 419 |
| 418 Iterator<E> get iterator => new WhereIterator<E>(_iterable.iterator, _f); | 420 Iterator<E> get iterator => new WhereIterator<E>(_iterable.iterator, _f); |
| 419 } | 421 } |
| 420 | 422 |
| 421 class WhereIterator<E> extends Iterator<E> { | 423 class WhereIterator<E> extends Iterator<E> { |
| 422 final Iterator<E> _iterator; | 424 final Iterator<E> _iterator; |
| 423 final _ElementPredicate _f; | 425 // TODO(ahe): Restore type when feature is implemented in dart2js |
| 426 // checked mode. http://dartbug.com/7733 |
| 427 final /* _ElementPredicate */ _f; |
| 424 | 428 |
| 425 WhereIterator(this._iterator, bool this._f(E element)); | 429 WhereIterator(this._iterator, bool this._f(E element)); |
| 426 | 430 |
| 427 bool moveNext() { | 431 bool moveNext() { |
| 428 while (_iterator.moveNext()) { | 432 while (_iterator.moveNext()) { |
| 429 if (_f(_iterator.current)) { | 433 if (_f(_iterator.current)) { |
| 430 return true; | 434 return true; |
| 431 } | 435 } |
| 432 } | 436 } |
| 433 return false; | 437 return false; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 469 } | 473 } |
| 470 | 474 |
| 471 E get current { | 475 E get current { |
| 472 if (_remaining < 0) return null; | 476 if (_remaining < 0) return null; |
| 473 return _iterator.current; | 477 return _iterator.current; |
| 474 } | 478 } |
| 475 } | 479 } |
| 476 | 480 |
| 477 class TakeWhileIterable<E> extends Iterable<E> { | 481 class TakeWhileIterable<E> extends Iterable<E> { |
| 478 final Iterable<E> _iterable; | 482 final Iterable<E> _iterable; |
| 479 final _ElementPredicate _f; | 483 // TODO(ahe): Restore type when feature is implemented in dart2js |
| 484 // checked mode. http://dartbug.com/7733 |
| 485 final /* _ElementPredicate */ _f; |
| 480 | 486 |
| 481 TakeWhileIterable(this._iterable, bool this._f(E element)); | 487 TakeWhileIterable(this._iterable, bool this._f(E element)); |
| 482 | 488 |
| 483 Iterator<E> get iterator { | 489 Iterator<E> get iterator { |
| 484 return new TakeWhileIterator<E>(_iterable.iterator, _f); | 490 return new TakeWhileIterator<E>(_iterable.iterator, _f); |
| 485 } | 491 } |
| 486 } | 492 } |
| 487 | 493 |
| 488 class TakeWhileIterator<E> extends Iterator<E> { | 494 class TakeWhileIterator<E> extends Iterator<E> { |
| 489 final Iterator<E> _iterator; | 495 final Iterator<E> _iterator; |
| 490 final _ElementPredicate _f; | 496 // TODO(ahe): Restore type when feature is implemented in dart2js |
| 497 // checked mode. http://dartbug.com/7733 |
| 498 final /* _ElementPredicate */ _f; |
| 491 bool _isFinished = false; | 499 bool _isFinished = false; |
| 492 | 500 |
| 493 TakeWhileIterator(this._iterator, bool this._f(E element)); | 501 TakeWhileIterator(this._iterator, bool this._f(E element)); |
| 494 | 502 |
| 495 bool moveNext() { | 503 bool moveNext() { |
| 496 if (_isFinished) return false; | 504 if (_isFinished) return false; |
| 497 if (!_iterator.moveNext() || !_f(_iterator.current)) { | 505 if (!_iterator.moveNext() || !_f(_iterator.current)) { |
| 498 _isFinished = true; | 506 _isFinished = true; |
| 499 return false; | 507 return false; |
| 500 } | 508 } |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 541 for (int i = 0; i < _skipCount; i++) _iterator.moveNext(); | 549 for (int i = 0; i < _skipCount; i++) _iterator.moveNext(); |
| 542 _skipCount = 0; | 550 _skipCount = 0; |
| 543 return _iterator.moveNext(); | 551 return _iterator.moveNext(); |
| 544 } | 552 } |
| 545 | 553 |
| 546 E get current => _iterator.current; | 554 E get current => _iterator.current; |
| 547 } | 555 } |
| 548 | 556 |
| 549 class SkipWhileIterable<E> extends Iterable<E> { | 557 class SkipWhileIterable<E> extends Iterable<E> { |
| 550 final Iterable<E> _iterable; | 558 final Iterable<E> _iterable; |
| 551 final _ElementPredicate _f; | 559 // TODO(ahe): Restore type when feature is implemented in dart2js |
| 560 // checked mode. http://dartbug.com/7733 |
| 561 final /* _ElementPredicate */ _f; |
| 552 | 562 |
| 553 SkipWhileIterable(this._iterable, bool this._f(E element)); | 563 SkipWhileIterable(this._iterable, bool this._f(E element)); |
| 554 | 564 |
| 555 Iterator<E> get iterator { | 565 Iterator<E> get iterator { |
| 556 return new SkipWhileIterator<E>(_iterable.iterator, _f); | 566 return new SkipWhileIterator<E>(_iterable.iterator, _f); |
| 557 } | 567 } |
| 558 } | 568 } |
| 559 | 569 |
| 560 class SkipWhileIterator<E> extends Iterator<E> { | 570 class SkipWhileIterator<E> extends Iterator<E> { |
| 561 final Iterator<E> _iterator; | 571 final Iterator<E> _iterator; |
| 562 final _ElementPredicate _f; | 572 // TODO(ahe): Restore type when feature is implemented in dart2js |
| 573 // checked mode. http://dartbug.com/7733 |
| 574 final /* _ElementPredicate */ _f; |
| 563 bool _hasSkipped = false; | 575 bool _hasSkipped = false; |
| 564 | 576 |
| 565 SkipWhileIterator(this._iterator, bool this._f(E element)); | 577 SkipWhileIterator(this._iterator, bool this._f(E element)); |
| 566 | 578 |
| 567 bool moveNext() { | 579 bool moveNext() { |
| 568 if (!_hasSkipped) { | 580 if (!_hasSkipped) { |
| 569 _hasSkipped = true; | 581 _hasSkipped = true; |
| 570 while (_iterator.moveNext()) { | 582 while (_iterator.moveNext()) { |
| 571 if (!_f(_iterator.current)) return true; | 583 if (!_f(_iterator.current)) return true; |
| 572 } | 584 } |
| 573 } | 585 } |
| 574 return _iterator.moveNext(); | 586 return _iterator.moveNext(); |
| 575 } | 587 } |
| 576 | 588 |
| 577 E get current => _iterator.current; | 589 E get current => _iterator.current; |
| 578 } | 590 } |
| OLD | NEW |