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

Unified Diff: sdk/lib/core/iterable.dart

Issue 14022007: Move Iterable implementation to collection. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Address comments. Merge to head. 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sdk/lib/collection/splay_tree.dart ('k') | sdk/lib/core/set.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sdk/lib/core/iterable.dart
diff --git a/sdk/lib/core/iterable.dart b/sdk/lib/core/iterable.dart
index d1583dc2b745bfa9a647d2be0e62c681ca268458..9a0bf6fc89a47711f2fa358b0fbea891e6c373b9 100644
--- a/sdk/lib/core/iterable.dart
+++ b/sdk/lib/core/iterable.dart
@@ -48,7 +48,7 @@ abstract class Iterable<E> {
* multiple times over the the returned [Iterable] will invoke the supplied
* function [f] multiple times on the same element.
*/
- Iterable map(f(E element)) => new MappedIterable<E, dynamic>(this, f);
+ Iterable map(f(E element));
/**
* Returns a lazy [Iterable] with all elements that satisfy the
@@ -60,8 +60,7 @@ abstract class Iterable<E> {
* multiple times over the the returned [Iterable] will invoke the supplied
* function [f] multiple times on the same element.
*/
- Iterable<E> where(bool f(E element)) => new WhereIterable<E>(this, f);
-
+ Iterable<E> where(bool f(E element));
/**
* Expand each element of this [Iterable] into zero or more elements.
@@ -72,28 +71,20 @@ abstract class Iterable<E> {
* The returned [Iterable] is lazy, and will call [f] for each element
* of this every time it's iterated.
*/
- Iterable expand(Iterable f(E element)) =>
- new ExpandIterable<E, dynamic>(this, f);
+ Iterable expand(Iterable f(E element));
/**
* Check whether the collection contains an element equal to [element].
*/
- bool contains(E element) {
- for (E e in this) {
- if (e == element) return true;
- }
- return false;
- }
+ bool contains(E element);
/**
* Applies the function [f] to each element of this collection.
*/
- void forEach(void f(E element)) {
- for (E element in this) f(element);
- }
+ void forEach(void f(E element));
/**
- * Reduce a collection to a single value by iteratively combining elements
+ * Reduces a collection to a single value by iteratively combining elements
* of the collection using the provided function.
*
* Example of calculating the sum of an iterable:
@@ -101,21 +92,13 @@ abstract class Iterable<E> {
* iterable.reduce((value, element) => value + element);
*
*/
- E reduce(E combine(E value, E element)) {
- Iterator<E> iterator = this.iterator;
- if (!iterator.moveNext()) {
- throw new StateError("No elements");
- }
- E value = iterator.current;
- while (iterator.moveNext()) {
- value = combine(value, iterator.current);
- }
- return value;
- }
+ E reduce(E combine(E value, E element));
/**
- * Reduce a collection to a single value by iteratively combining each element
- * of the collection with an existing value using the provided function.
+ * Reduces a collection to a single value by iteratively combining each
+ * element of the collection with an existing value using the provided
+ * function.
+ *
* Use [initialValue] as the initial value, and the function [combine] to
* create a new value from the previous one and an element.
*
@@ -125,25 +108,16 @@ abstract class Iterable<E> {
*
*/
dynamic fold(var initialValue,
- dynamic combine(var previousValue, E element)) {
- var value = initialValue;
- for (E element in this) value = combine(value, element);
- return value;
- }
+ dynamic combine(var previousValue, E element));
/**
* Returns true if every elements of this collection satisify the
* predicate [f]. Returns false otherwise.
*/
- bool every(bool f(E element)) {
- for (E element in this) {
- if (!f(element)) return false;
- }
- return true;
- }
+ bool every(bool f(E element));
/**
- * Convert each element to a [String] and concatenate the strings.
+ * Converts each element to a [String] and concatenates the strings.
*
* Converts each element to a [String] by calling [Object.toString] on it.
* Then concatenates the strings, optionally separated by the [separator]
@@ -159,16 +133,20 @@ abstract class Iterable<E> {
* Returns true if one element of this collection satisfies the
* predicate [f]. Returns false otherwise.
*/
- bool any(bool f(E element)) {
- for (E element in this) {
- if (f(element)) return true;
- }
- return false;
- }
+ bool any(bool f(E element));
- List<E> toList({ bool growable: true }) =>
- new List<E>.from(this, growable: growable);
- Set<E> toSet() => new Set<E>.from(this);
+ /**
+ * Creates a [List] containing the elements of this [Iterable].
+ *
+ * The elements will be in iteration order. The list is fixed-length
+ * if [growable] is false.
+ */
+ List<E> toList({ bool growable: true });
+
+ /**
+ * Creates a [Set] containing the elements of this [Iterable].
+ */
+ Set<E> toSet();
/**
* Returns the number of elements in [this].
@@ -176,19 +154,12 @@ abstract class Iterable<E> {
* Counting all elements may be involve running through all elements and can
* therefore be slow.
*/
- int get length {
- int count = 0;
- Iterator it = iterator;
- while (it.moveNext()) {
- count++;
- }
- return count;
- }
+ int get length;
/**
* Returns true if there is no element in this collection.
*/
- bool get isEmpty => !iterator.moveNext();
+ bool get isEmpty;
/**
* Returns an [Iterable] with at most [n] elements.
@@ -196,9 +167,7 @@ abstract class Iterable<E> {
* The returned [Iterable] may contain fewer than [n] elements, if [this]
* contains fewer than [n] elements.
*/
- Iterable<E> take(int n) {
- return new TakeIterable<E>(this, n);
- }
+ Iterable<E> take(int n);
/**
* Returns an [Iterable] that stops once [test] is not satisfied anymore.
@@ -209,9 +178,7 @@ abstract class Iterable<E> {
* it discards [:e:] and moves into the finished state. That is, it will not
* ask or provide any more elements.
*/
- Iterable<E> takeWhile(bool test(E value)) {
- return new TakeWhileIterable<E>(this, test);
- }
+ Iterable<E> takeWhile(bool test(E value));
/**
* Returns an [Iterable] that skips the first [n] elements.
@@ -219,9 +186,7 @@ abstract class Iterable<E> {
* If [this] has fewer than [n] elements, then the resulting [Iterable] will
* be empty.
*/
- Iterable<E> skip(int n) {
- return new SkipIterable<E>(this, n);
- }
+ Iterable<E> skip(int n);
/**
* Returns an [Iterable] that skips elements while [test] is satisfied.
@@ -232,9 +197,7 @@ abstract class Iterable<E> {
* discarded. Once an element satisfies the [test] the iterator stops testing
* and uses every element unconditionally.
*/
- Iterable<E> skipWhile(bool test(E value)) {
- return new SkipWhileIterable<E>(this, test);
- }
+ Iterable<E> skipWhile(bool test(E value));
/**
* Returns the first element.
@@ -242,43 +205,21 @@ abstract class Iterable<E> {
* If [this] is empty throws a [StateError]. Otherwise this method is
* equivalent to [:this.elementAt(0):]
*/
- E get first {
- Iterator it = iterator;
- if (!it.moveNext()) {
- throw new StateError("No elements");
- }
- return it.current;
- }
+ E get first;
/**
* Returns the last element.
*
* If [this] is empty throws a [StateError].
*/
- E get last {
- Iterator it = iterator;
- if (!it.moveNext()) {
- throw new StateError("No elements");
- }
- E result;
- do {
- result = it.current;
- } while(it.moveNext());
- return result;
- }
+ E get last;
/**
* Returns the single element in [this].
*
* If [this] is empty or has more than one element throws a [StateError].
*/
- E get single {
- Iterator it = iterator;
- if (!it.moveNext()) throw new StateError("No elements");
- E result = it.current;
- if (it.moveNext()) throw new StateError("More than one element");
- return result;
- }
+ E get single;
/**
* Returns the first element that satisfies the given predicate [f].
@@ -287,14 +228,7 @@ abstract class Iterable<E> {
* returned. By default, when [orElse] is `null`, a [StateError] is
* thrown.
*/
- E firstWhere(bool test(E value), { E orElse() }) {
- // TODO(floitsch): check that arguments are of correct type?
- for (E element in this) {
- if (test(element)) return element;
- }
- if (orElse != null) return orElse();
- throw new StateError("No matching element");
- }
+ E firstWhere(bool test(E value), { E orElse() });
/**
* Returns the last element that satisfies the given predicate [f].
@@ -303,41 +237,13 @@ abstract class Iterable<E> {
* returned. By default, when [orElse] is [:null:], a [StateError] is
* thrown.
*/
- E lastWhere(bool test(E value), {E orElse()}) {
- // TODO(floitsch): check that arguments are of correct type?
- E result = null;
- bool foundMatching = false;
- for (E element in this) {
- if (test(element)) {
- result = element;
- foundMatching = true;
- }
- }
- if (foundMatching) return result;
- if (orElse != null) return orElse();
- throw new StateError("No matching element");
- }
+ E lastWhere(bool test(E value), {E orElse()});
/**
* Returns the single element that satisfies [f]. If no or more than one
* element match then a [StateError] is thrown.
*/
- E singleWhere(bool test(E value)) {
- // TODO(floitsch): check that argument is of correct type?
- E result = null;
- bool foundMatching = false;
- for (E element in this) {
- if (test(element)) {
- if (foundMatching) {
- throw new StateError("More than one matching element");
- }
- result = element;
- foundMatching = true;
- }
- }
- if (foundMatching) return result;
- throw new StateError("No matching element");
- }
+ E singleWhere(bool test(E value));
/**
* Returns the [index]th element.
@@ -349,21 +255,13 @@ abstract class Iterable<E> {
* function may simply return any element without any iteration if there are
* at least [index] elements in [this].
*/
- E elementAt(int index) {
- if (index is! int || index < 0) throw new RangeError.value(index);
- int remaining = index;
- for (E element in this) {
- if (remaining == 0) return element;
- remaining--;
- }
- throw new RangeError.value(index);
- }
+ E elementAt(int index);
}
typedef E _Generator<E>(int index);
-class _GeneratorIterable<E> extends Iterable<E> {
+class _GeneratorIterable<E> extends IterableBase<E> {
final int _count;
final _Generator<E> _generator;
_GeneratorIterable(this._count, this._generator);
@@ -395,7 +293,7 @@ class _GeneratorIterator<E> implements Iterator<E> {
/**
* An [Iterator] that allows moving backwards as well as forwards.
*/
-abstract class BidirectionalIterator<T> extends Iterator<T> {
+abstract class BidirectionalIterator<E> implements Iterator<E> {
/**
* Move back to the previous element.
*
« no previous file with comments | « sdk/lib/collection/splay_tree.dart ('k') | sdk/lib/core/set.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698