| // 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; |
| } |
| |
| |