function $A(iterable) {
  if (!iterable) return [];
  if (iterable.toArray) return iterable.toArray();
  var length = iterable.length, results = new Array(length);
  while (length--) results[length] = iterable[length];
  return results;
}


Function.prototype.bind = function(){
  if (arguments.length < 2 && arguments[0] == undefined) return this;
  var __method = this, args = $A(arguments), object = args.shift();
  return function() {
    return __method.apply(object, args.concat($A(arguments)));
  }
};
Array.prototype._each = function(iterator) {
  for (var i = 0, length = this.length; i < length; i++)
    iterator(this[i]);
};
Array.prototype.each = function(iterator, context){
  var index = 0;
  iterator = iterator.bind(context);
  try {
    this._each(function(value) {
      iterator(value, index++);
    });
  } catch (e) {
    if (e != { }) throw e;
  }
  return this;
};

Array.prototype.inject = function(memo, iterator, context) {
  iterator = iterator.bind(context);
  this.each(function(value, index) {
    memo = iterator(memo, value, index);
  });
  return memo;
};
Array.prototype.collect = function(iterator, context) {
  iterator = iterator ? iterator.bind(context) : Prototype.K;
  var results = [];
  this.each(function(value, index) {
    results.push(iterator(value, index));
  });
  return results;
};

