|
1 Object.extend = function(destination, source) { |
|
2 for (var property in source) |
|
3 destination[property] = source[property]; |
|
4 }; |
|
5 var Enumerable = { |
|
6 _each: function(iterator) { |
|
7 for (var i = 0, length = this.length; i < length; i++) |
|
8 iterator(this[i]); |
|
9 }, |
|
10 each: function(iterator, context) { |
|
11 var index = 0; |
|
12 this._each(function(value) { |
|
13 iterator.call(context, value, index++); |
|
14 }); |
|
15 }, |
|
16 map: function(iterator, context) { |
|
17 var results = []; |
|
18 this.each(function(value, index) { |
|
19 var res = iterator.call(context, value); |
|
20 results.push(res); |
|
21 }); |
|
22 return results; |
|
23 }, |
|
24 invoke: function(method) { |
|
25 var args = $A(arguments).slice(1); |
|
26 return this.map(function(value) { |
|
27 return value[method].apply(value, args); |
|
28 }); |
|
29 }, |
|
30 }; |
|
31 Object.extend(Array.prototype, Enumerable); |
|
32 function $A(iterable) { |
|
33 var length = iterable.length || 0, results = new Array(length); |
|
34 while (length--) results[length] = iterable[length]; |
|
35 return results; |
|
36 } |
|
37 function g() { |
|
38 return [1, 2, 3, 4, 5].each(function(part) { |
|
39 return 0; |
|
40 }); |
|
41 } |
|
42 function f() { |
|
43 g(); |
|
44 g(); |
|
45 g(); |
|
46 g(); |
|
47 var result = [[2, 1, 3], [6, 5, 4]]; |
|
48 result = result.invoke('invoke', 'toString', 2); |
|
49 result[0].join(', '); |
|
50 }; |
|
51 f(); |