Index: sdk/lib/collection/collections.dart |
diff --git a/sdk/lib/collection/collections.dart b/sdk/lib/collection/collections.dart |
index 9224cd1cc06eaf05f91d5cd175088a0c29afe6e4..4bd1fadb513ce5e84a36fbb51ae347e2db93af69 100644 |
--- a/sdk/lib/collection/collections.dart |
+++ b/sdk/lib/collection/collections.dart |
@@ -23,7 +23,7 @@ class Collections { |
} |
} |
- static bool some(Iterable iterable, bool f(o)) { |
+ static bool any(Iterable iterable, bool f(o)) { |
for (final e in iterable) { |
if (f(e)) return true; |
} |
@@ -37,13 +37,6 @@ class Collections { |
return true; |
} |
- static List map(Iterable source, List destination, f(o)) { |
- for (final e in source) { |
- destination.add(f(e)); |
- } |
- return destination; |
- } |
- |
static dynamic reduce(Iterable iterable, |
dynamic initialValue, |
dynamic combine(dynamic previousValue, element)) { |
@@ -53,15 +46,162 @@ class Collections { |
return initialValue; |
} |
- static List filter(Iterable source, List destination, bool f(o)) { |
- for (final e in source) { |
- if (f(e)) destination.add(e); |
+ static bool isEmpty(Iterable iterable) { |
+ return !iterable.iterator.moveNext(); |
+ } |
+ |
+ static dynamic first(Iterable iterable) { |
+ Iterator it = iterable.iterator; |
+ if (!it.moveNext()) { |
+ throw new StateError("No elements"); |
} |
- return destination; |
+ return it.current; |
} |
- static bool isEmpty(Iterable iterable) { |
- return !iterable.iterator().hasNext; |
+ static dynamic last(Iterable iterable) { |
+ Iterator it = iterable.iterator; |
+ if (!it.moveNext()) { |
+ throw new StateError("No elements"); |
+ } |
+ dynamic result; |
+ do { |
+ result = it.current; |
+ } while(it.moveNext()); |
+ return result; |
+ } |
+ |
+ static dynamic min(Iterable iterable, [int compare(var a, var b)]) { |
+ if (compare == null) compare = Comparable.compare; |
+ Iterator it = iterable.iterator; |
+ if (!it.moveNext()) { |
+ return null; |
+ } |
+ var min = it.current; |
+ while (it.moveNext()) { |
+ if (compare(min, it.current) > 0) min = it.current; |
+ } |
+ return min; |
+ } |
+ |
+ static dynamic max(Iterable iterable, [int compare(var a, var b)]) { |
+ if (compare == null) compare = Comparable.compare; |
+ Iterator it = iterable.iterator; |
+ if (!it.moveNext()) { |
+ return null; |
+ } |
+ var max = it.current; |
+ while (it.moveNext()) { |
+ if (compare(max, it.current) < 0) max = it.current; |
+ } |
+ return max; |
+ } |
+ |
+ static dynamic single(Iterable iterable) { |
+ Iterator it = iterable.iterator; |
+ if (!it.moveNext()) throw new StateError("No elements"); |
+ dynamic result = it.current; |
+ if (it.moveNext()) throw new StateError("More than one element"); |
+ return result; |
+ } |
+ |
+ static dynamic firstMatching(Iterable iterable, |
+ bool test(dynamic value), |
+ dynamic orElse()) { |
+ for (dynamic element in iterable) { |
+ if (test(element)) return element; |
+ } |
+ if (orElse != null) return orElse(); |
+ throw new StateError("No matching element"); |
+ } |
+ |
+ static dynamic lastMatching(Iterable iterable, |
+ bool test(dynamic value), |
+ dynamic orElse()) { |
+ dynamic result = null; |
+ bool foundMatching = false; |
+ for (dynamic element in iterable) { |
+ if (test(element)) { |
+ result = element; |
+ foundMatching = true; |
+ } |
+ } |
+ if (foundMatching) return result; |
+ if (orElse != null) return orElse(); |
+ throw new StateError("No matching element"); |
+ } |
+ |
+ static dynamic lastMatchingInList(List list, |
+ bool test(dynamic value), |
+ dynamic orElse()) { |
+ // TODO(floitsch): check that arguments are of correct type? |
+ for (int i = list.length - 1; i >= 0; i--) { |
+ dynamic element = list[i]; |
+ if (test(element)) return element; |
+ } |
+ if (orElse != null) return orElse(); |
+ throw new StateError("No matching element"); |
+ } |
+ |
+ static dynamic singleMatching(Iterable iterable, bool test(dynamic value)) { |
+ dynamic result = null; |
+ bool foundMatching = false; |
+ for (dynamic element in iterable) { |
+ 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"); |
+ } |
+ |
+ static dynamic elementAt(Iterable iterable, int index) { |
+ if (index is! int || index < 0) throw new RangeError.value(index); |
+ int remaining = index; |
+ for (dynamic element in iterable) { |
+ if (remaining == 0) return element; |
+ remaining--; |
+ } |
+ throw new RangeError.value(index); |
+ } |
+ |
+ static String join(Iterable iterable, [String separator]) { |
+ Iterator iterator = iterable.iterator; |
+ if (!iterator.moveNext()) return ""; |
+ StringBuffer buffer = new StringBuffer(); |
+ if (separator == null || separator == "") { |
+ do { |
+ buffer.add("${iterator.current}"); |
+ } while (iterator.moveNext()); |
+ } else { |
+ buffer.add("${iterator.current}"); |
+ while (iterator.moveNext()) { |
+ buffer.add(separator); |
+ buffer.add("${iterator.current}"); |
+ } |
+ } |
+ return buffer.toString(); |
+ } |
+ |
+ static String joinList(List<Object> list, [String separator]) { |
+ if (list.isEmpty) return ""; |
+ if (list.length == 1) return "${list[0]}"; |
+ StringBuffer buffer = new StringBuffer(); |
+ if (separator == null || separator == "") { |
+ for (int i = 0; i < list.length; i++) { |
+ buffer.add("${list[i]}"); |
+ } |
+ } else { |
+ buffer.add("${list[0]}"); |
+ for (int i = 1; i < list.length; i++) { |
+ buffer.add(separator); |
+ buffer.add("${list[i]}"); |
+ } |
+ } |
+ return buffer.toString(); |
} |
// TODO(jjb): visiting list should be an identityHashSet when it exists |