03f5a66836
This reverts r18591. Review URL: https://codereview.chromium.org//12295009 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@18615 260f80e4-7a28-3924-810f-c04153c831b5
56 lines
1.4 KiB
Dart
56 lines
1.4 KiB
Dart
// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
// Collection<T> supports most of the ES 5 Array methods, but it's missing
|
|
// map and reduce.
|
|
|
|
// TODO(jmesserly): we might want a version of this that return an iterable,
|
|
// however JS, Python and Ruby versions are all eager.
|
|
List map(Iterable source, mapper(source)) {
|
|
List result = new List();
|
|
if (source is List) {
|
|
List list = source; // TODO: shouldn't need this
|
|
result.length = list.length;
|
|
for (int i = 0; i < list.length; i++) {
|
|
result[i] = mapper(list[i]);
|
|
}
|
|
} else {
|
|
for (final item in source) {
|
|
result.add(mapper(item));
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
reduce(Iterable source, callback, [initialValue]) {
|
|
final i = source.iterator;
|
|
|
|
var current = initialValue;
|
|
if (current == null && i.moveNext()) {
|
|
current = i.current;
|
|
}
|
|
while (i.moveNext()) {
|
|
current = callback(current, i.current);
|
|
}
|
|
return current;
|
|
}
|
|
|
|
List zip(Iterable left, Iterable right, mapper(left, right)) {
|
|
List result = new List();
|
|
var x = left.iterator;
|
|
var y = right.iterator;
|
|
while (x.moveNext()) {
|
|
if (!y.moveNext()) {
|
|
throw new ArgumentError();
|
|
}
|
|
result.add(mapper(x.current, y.current));
|
|
}
|
|
if (y.moveNext()) {
|
|
throw new ArgumentError();
|
|
}
|
|
return result;
|
|
}
|
|
|
|
|