Index: lib/core/collection.dart |
diff --git a/lib/core/collection.dart b/lib/core/collection.dart |
index ffad48d6c76913e76bb79efee8548fc3708b6b72..22381ab1e051e2e7a9963e7dea6b45212c557ec9 100644 |
--- a/lib/core/collection.dart |
+++ b/lib/core/collection.dart |
@@ -3,26 +3,57 @@ |
// BSD-style license that can be found in the LICENSE file. |
/** |
- * The [Collection] interface is the public interface of all |
- * collections. |
+ * The common interface of all collections. |
+ * |
+ * The [Collection] class contains a skeleton implementation of |
+ * an iterator based collection. |
*/ |
abstract class Collection<E> extends Iterable<E> { |
/** |
- * Applies the function [f] to each element of this collection. |
- */ |
- void forEach(void f(E element)); |
- |
- /** |
* Returns a new collection with the elements [: f(e) :] |
* for each element [:e:] of this collection. |
* |
- * Note on typing: the return type of f() could be an arbitrary |
- * type and consequently the returned collection's |
- * typeis Collection. |
+ * Subclasses of [Collection] should implement the [map] method |
+ * to return a collection of the same general type as themselves. |
+ * E.g., [List.map] should return a [List]. |
*/ |
Collection map(f(E element)); |
/** |
+ * Returns a collection with the elements of this collection |
+ * that satisfy the predicate [f]. |
+ * |
+ * The returned collection should be of the same type as the collection |
+ * creating it. |
+ * |
+ * An element satisfies the predicate [f] if [:f(element):] |
+ * returns true. |
+ */ |
+ Collection<E> filter(bool f(E element)); |
+ |
+ /** |
+ * Returns the number of elements in this collection. |
+ */ |
+ int get length; |
+ |
+ /** |
+ * 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; |
+ } |
+ |
+ /** |
+ * Applies the function [f] to each element of this collection. |
+ */ |
+ void forEach(void f(E element)) { |
+ for (E element in this) f(element); |
+ } |
+ |
+ /** |
* Reduce 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 |
@@ -32,37 +63,37 @@ abstract class Collection<E> extends Iterable<E> { |
* |
* collection.reduce(0, (prev, element) => prev + element); |
*/ |
- Dynamic reduce(Dynamic initialValue, |
- Dynamic combine(Dynamic previousValue, E element)); |
- |
- /** |
- * Returns a new collection with the elements of this collection |
- * that satisfy the predicate [f]. |
- * |
- * An element satisfies the predicate [f] if [:f(element):] |
- * returns true. |
- */ |
- Collection<E> filter(bool f(E element)); |
+ Dynamic reduce(var initialValue, |
+ Dynamic combine(var previousValue, E element)) { |
+ var value = initialValue; |
+ for (E element in this) value = combine(value, element); |
+ return value; |
+ } |
/** |
* Returns true if every elements of this collection satisify the |
* predicate [f]. Returns false otherwise. |
*/ |
- bool every(bool f(E element)); |
+ bool every(bool f(E element)) { |
+ for (E element in this) { |
+ if (!f(element)) return false; |
+ } |
+ return true; |
+ } |
/** |
* Returns true if one element of this collection satisfies the |
* predicate [f]. Returns false otherwise. |
*/ |
- bool some(bool f(E element)); |
+ bool some(bool f(E element)) { |
+ for (E element in this) { |
+ if (f(element)) return true; |
+ } |
+ return false; |
+ } |
/** |
* Returns true if there is no element in this collection. |
*/ |
- bool isEmpty(); |
- |
- /** |
- * Returns the number of elements in this collection. |
- */ |
- int get length; |
+ bool isEmpty() => !iterator().hasNext(); |
} |