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


