michael@0: Object.extend = function(destination, source) { michael@0: for (var property in source) michael@0: destination[property] = source[property]; michael@0: }; michael@0: var Enumerable = { michael@0: _each: function(iterator) { michael@0: for (var i = 0, length = this.length; i < length; i++) michael@0: iterator(this[i]); michael@0: }, michael@0: each: function(iterator, context) { michael@0: var index = 0; michael@0: this._each(function(value) { michael@0: iterator.call(context, value, index++); michael@0: }); michael@0: }, michael@0: map: function(iterator, context) { michael@0: var results = []; michael@0: this.each(function(value, index) { michael@0: var res = iterator.call(context, value); michael@0: results.push(res); michael@0: }); michael@0: return results; michael@0: }, michael@0: invoke: function(method) { michael@0: var args = $A(arguments).slice(1); michael@0: return this.map(function(value) { michael@0: return value[method].apply(value, args); michael@0: }); michael@0: }, michael@0: }; michael@0: Object.extend(Array.prototype, Enumerable); michael@0: function $A(iterable) { michael@0: var length = iterable.length || 0, results = new Array(length); michael@0: while (length--) results[length] = iterable[length]; michael@0: return results; michael@0: } michael@0: function g() { michael@0: return [1, 2, 3, 4, 5].each(function(part) { michael@0: return 0; michael@0: }); michael@0: } michael@0: function f() { michael@0: g(); michael@0: g(); michael@0: g(); michael@0: g(); michael@0: var result = [[2, 1, 3], [6, 5, 4]]; michael@0: result = result.invoke('invoke', 'toString', 2); michael@0: result[0].join(', '); michael@0: }; michael@0: f();