| 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.
|
| *
|
|
|