Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(148)

Side by Side Diff: sdk/lib/_collection_dev/iterable.dart

Issue 14022007: Move Iterable implementation to collection. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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._collection.dev; 5 part of dart._collection.dev;
6 6
7 /** 7 /**
8 * An [Iterable] for classes that have efficient [length] and [elementAt]. 8 * An [Iterable] for classes that have efficient [length] and [elementAt].
9 * 9 *
10 * All other methods are implemented in terms of [length] and [elementAt], 10 * All other methods are implemented in terms of [length] and [elementAt],
11 * including [iterator]. 11 * including [iterator].
12 */ 12 */
13 abstract class ListIterable<E> extends Iterable<E> { 13 abstract class ListIterable<E> extends IterableBase<E> {
14 int get length; 14 int get length;
15 E elementAt(int i); 15 E elementAt(int i);
16 16
17 const ListIterable(); 17 const ListIterable();
18 18
19 Iterator<E> get iterator => new ListIterator<E>(this); 19 Iterator<E> get iterator => new ListIterator<E>(this);
20 20
21 void forEach(void action(E element)) { 21 void forEach(void action(E element)) {
22 int length = this.length; 22 int length = this.length;
23 for (int i = 0; i < length; i++) { 23 for (int i = 0; i < length; i++) {
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
291 return false; 291 return false;
292 } 292 }
293 _current = _iterable.elementAt(_index); 293 _current = _iterable.elementAt(_index);
294 _index++; 294 _index++;
295 return true; 295 return true;
296 } 296 }
297 } 297 }
298 298
299 typedef T _Transformation<S, T>(S value); 299 typedef T _Transformation<S, T>(S value);
300 300
301 class MappedIterable<S, T> extends Iterable<T> { 301 class MappedIterable<S, T> extends IterableBase<T> {
302 final Iterable<S> _iterable; 302 final Iterable<S> _iterable;
303 // TODO(ahe): Restore type when feature is implemented in dart2js 303 // TODO(ahe): Restore type when feature is implemented in dart2js
304 // checked mode. http://dartbug.com/7733 304 // checked mode. http://dartbug.com/7733
305 final /* _Transformation<S, T> */ _f; 305 final /* _Transformation<S, T> */ _f;
306 306
307 MappedIterable(this._iterable, T this._f(S element)); 307 MappedIterable(this._iterable, T this._f(S element));
308 308
309 Iterator<T> get iterator => new MappedIterator<S, T>(_iterable.iterator, _f); 309 Iterator<T> get iterator => new MappedIterator<S, T>(_iterable.iterator, _f);
310 310
311 // Length related functions are independent of the mapping. 311 // Length related functions are independent of the mapping.
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
349 349
350 MappedListIterable(this._source, T this._f(S value)); 350 MappedListIterable(this._source, T this._f(S value));
351 351
352 int get length => _source.length; 352 int get length => _source.length;
353 T elementAt(int index) => _f(_source.elementAt(index)); 353 T elementAt(int index) => _f(_source.elementAt(index));
354 } 354 }
355 355
356 356
357 typedef bool _ElementPredicate<E>(E element); 357 typedef bool _ElementPredicate<E>(E element);
358 358
359 class WhereIterable<E> extends Iterable<E> { 359 class WhereIterable<E> extends IterableBase<E> {
360 final Iterable<E> _iterable; 360 final Iterable<E> _iterable;
361 // TODO(ahe): Restore type when feature is implemented in dart2js 361 // TODO(ahe): Restore type when feature is implemented in dart2js
362 // checked mode. http://dartbug.com/7733 362 // checked mode. http://dartbug.com/7733
363 final /* _ElementPredicate */ _f; 363 final /* _ElementPredicate */ _f;
364 364
365 WhereIterable(this._iterable, bool this._f(E element)); 365 WhereIterable(this._iterable, bool this._f(E element));
366 366
367 Iterator<E> get iterator => new WhereIterator<E>(_iterable.iterator, _f); 367 Iterator<E> get iterator => new WhereIterator<E>(_iterable.iterator, _f);
368 } 368 }
369 369
(...skipping 12 matching lines...) Expand all
382 } 382 }
383 } 383 }
384 return false; 384 return false;
385 } 385 }
386 386
387 E get current => _iterator.current; 387 E get current => _iterator.current;
388 } 388 }
389 389
390 typedef Iterable<T> _ExpandFunction<S, T>(S sourceElement); 390 typedef Iterable<T> _ExpandFunction<S, T>(S sourceElement);
391 391
392 class ExpandIterable<S, T> extends Iterable<T> { 392 class ExpandIterable<S, T> extends IterableBase<T> {
393 final Iterable<S> _iterable; 393 final Iterable<S> _iterable;
394 // TODO(ahe): Restore type when feature is implemented in dart2js 394 // TODO(ahe): Restore type when feature is implemented in dart2js
395 // checked mode. http://dartbug.com/7733 395 // checked mode. http://dartbug.com/7733
396 final /* _ExpandFunction */ _f; 396 final /* _ExpandFunction */ _f;
397 397
398 ExpandIterable(this._iterable, Iterable<T> this._f(S element)); 398 ExpandIterable(this._iterable, Iterable<T> this._f(S element));
399 399
400 Iterator<T> get iterator => new ExpandIterator<S, T>(_iterable.iterator, _f); 400 Iterator<T> get iterator => new ExpandIterator<S, T>(_iterable.iterator, _f);
401 } 401 }
402 402
(...skipping 26 matching lines...) Expand all
429 _currentExpansion = _f(_iterator.current).iterator; 429 _currentExpansion = _f(_iterator.current).iterator;
430 } else { 430 } else {
431 return false; 431 return false;
432 } 432 }
433 } 433 }
434 _current = _currentExpansion.current; 434 _current = _currentExpansion.current;
435 return true; 435 return true;
436 } 436 }
437 } 437 }
438 438
439 class TakeIterable<E> extends Iterable<E> { 439 class TakeIterable<E> extends IterableBase<E> {
440 final Iterable<E> _iterable; 440 final Iterable<E> _iterable;
441 final int _takeCount; 441 final int _takeCount;
442 442
443 TakeIterable(this._iterable, this._takeCount) { 443 TakeIterable(this._iterable, this._takeCount) {
444 if (_takeCount is! int || _takeCount < 0) { 444 if (_takeCount is! int || _takeCount < 0) {
445 throw new ArgumentError(_takeCount); 445 throw new ArgumentError(_takeCount);
446 } 446 }
447 } 447 }
448 448
449 Iterator<E> get iterator { 449 Iterator<E> get iterator {
(...skipping 17 matching lines...) Expand all
467 _remaining = -1; 467 _remaining = -1;
468 return false; 468 return false;
469 } 469 }
470 470
471 E get current { 471 E get current {
472 if (_remaining < 0) return null; 472 if (_remaining < 0) return null;
473 return _iterator.current; 473 return _iterator.current;
474 } 474 }
475 } 475 }
476 476
477 class TakeWhileIterable<E> extends Iterable<E> { 477 class TakeWhileIterable<E> extends IterableBase<E> {
478 final Iterable<E> _iterable; 478 final Iterable<E> _iterable;
479 // TODO(ahe): Restore type when feature is implemented in dart2js 479 // TODO(ahe): Restore type when feature is implemented in dart2js
480 // checked mode. http://dartbug.com/7733 480 // checked mode. http://dartbug.com/7733
481 final /* _ElementPredicate */ _f; 481 final /* _ElementPredicate */ _f;
482 482
483 TakeWhileIterable(this._iterable, bool this._f(E element)); 483 TakeWhileIterable(this._iterable, bool this._f(E element));
484 484
485 Iterator<E> get iterator { 485 Iterator<E> get iterator {
486 return new TakeWhileIterator<E>(_iterable.iterator, _f); 486 return new TakeWhileIterator<E>(_iterable.iterator, _f);
487 } 487 }
(...skipping 16 matching lines...) Expand all
504 } 504 }
505 return true; 505 return true;
506 } 506 }
507 507
508 E get current { 508 E get current {
509 if (_isFinished) return null; 509 if (_isFinished) return null;
510 return _iterator.current; 510 return _iterator.current;
511 } 511 }
512 } 512 }
513 513
514 class SkipIterable<E> extends Iterable<E> { 514 class SkipIterable<E> extends IterableBase<E> {
515 final Iterable<E> _iterable; 515 final Iterable<E> _iterable;
516 final int _skipCount; 516 final int _skipCount;
517 517
518 SkipIterable(this._iterable, this._skipCount) { 518 SkipIterable(this._iterable, this._skipCount) {
519 if (_skipCount is! int || _skipCount < 0) { 519 if (_skipCount is! int || _skipCount < 0) {
520 throw new ArgumentError(_skipCount); 520 throw new ArgumentError(_skipCount);
521 } 521 }
522 } 522 }
523 523
524 Iterable<E> skip(int n) { 524 Iterable<E> skip(int n) {
(...skipping 18 matching lines...) Expand all
543 543
544 bool moveNext() { 544 bool moveNext() {
545 for (int i = 0; i < _skipCount; i++) _iterator.moveNext(); 545 for (int i = 0; i < _skipCount; i++) _iterator.moveNext();
546 _skipCount = 0; 546 _skipCount = 0;
547 return _iterator.moveNext(); 547 return _iterator.moveNext();
548 } 548 }
549 549
550 E get current => _iterator.current; 550 E get current => _iterator.current;
551 } 551 }
552 552
553 class SkipWhileIterable<E> extends Iterable<E> { 553 class SkipWhileIterable<E> extends IterableBase<E> {
554 final Iterable<E> _iterable; 554 final Iterable<E> _iterable;
555 // TODO(ahe): Restore type when feature is implemented in dart2js 555 // TODO(ahe): Restore type when feature is implemented in dart2js
556 // checked mode. http://dartbug.com/7733 556 // checked mode. http://dartbug.com/7733
557 final /* _ElementPredicate */ _f; 557 final /* _ElementPredicate */ _f;
558 558
559 SkipWhileIterable(this._iterable, bool this._f(E element)); 559 SkipWhileIterable(this._iterable, bool this._f(E element));
560 560
561 Iterator<E> get iterator { 561 Iterator<E> get iterator {
562 return new SkipWhileIterator<E>(_iterable.iterator, _f); 562 return new SkipWhileIterator<E>(_iterable.iterator, _f);
563 } 563 }
(...skipping 17 matching lines...) Expand all
581 } 581 }
582 return _iterator.moveNext(); 582 return _iterator.moveNext();
583 } 583 }
584 584
585 E get current => _iterator.current; 585 E get current => _iterator.current;
586 } 586 }
587 587
588 /** 588 /**
589 * The always empty [Iterable]. 589 * The always empty [Iterable].
590 */ 590 */
591 class EmptyIterable<E> extends Iterable<E> { 591 class EmptyIterable<E> extends IterableBase<E> {
592 const EmptyIterable(); 592 const EmptyIterable();
593 593
594 Iterator<E> get iterator => const EmptyIterator(); 594 Iterator<E> get iterator => const EmptyIterator();
595 595
596 void forEach(void action(E element)) {} 596 void forEach(void action(E element)) {}
597 597
598 bool get isEmpty => true; 598 bool get isEmpty => true;
599 599
600 int get length => 0; 600 int get length => 0;
601 601
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
659 class EmptyIterator<E> implements Iterator<E> { 659 class EmptyIterator<E> implements Iterator<E> {
660 const EmptyIterator(); 660 const EmptyIterator();
661 bool moveNext() => false; 661 bool moveNext() => false;
662 E get current => null; 662 E get current => null;
663 } 663 }
664 664
665 /** An [Iterator] that can move in both directions. */ 665 /** An [Iterator] that can move in both directions. */
666 abstract class BidirectionalIterator<T> implements Iterator<T> { 666 abstract class BidirectionalIterator<T> implements Iterator<T> {
667 bool movePrevious(); 667 bool movePrevious();
668 } 668 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698