Skip to content

Commit c4a9149

Browse files
2 parents c22e224 + 1f569ae commit c4a9149

File tree

8 files changed

+428
-45
lines changed

8 files changed

+428
-45
lines changed

src/prototype/ajax/responders.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@
6969
Ajax.Responders = {
7070
responders: [],
7171

72-
_each: function(iterator) {
73-
this.responders._each(iterator);
72+
_each: function(iterator, context) {
73+
this.responders._each(iterator, context);
7474
},
7575

7676
/**

src/prototype/deprecated.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,10 +156,10 @@ Element.ClassNames.prototype = {
156156
this.element = $(element);
157157
},
158158

159-
_each: function(iterator) {
159+
_each: function(iterator, context) {
160160
this.element.className.split(/\s+/).select(function(name) {
161161
return name.length > 0;
162-
})._each(iterator);
162+
})._each(iterator, context);
163163
},
164164

165165
set: function(className) {

src/prototype/lang/array.js

Lines changed: 123 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -447,19 +447,122 @@ Array.from = $A;
447447
}
448448

449449
// Replaces a built-in function. No PDoc needed.
450-
function concat() {
451-
var array = slice.call(this, 0), item;
452-
for (var i = 0, length = arguments.length; i < length; i++) {
453-
item = arguments[i];
450+
function concat(_) {
451+
var array = [], items = slice.call(arguments, 0), item, n = 0;
452+
items.unshift(this);
453+
for (var i = 0, length = items.length; i < length; i++) {
454+
item = items[i];
454455
if (Object.isArray(item) && !('callee' in item)) {
455-
for (var j = 0, arrayLength = item.length; j < arrayLength; j++)
456-
array.push(item[j]);
456+
for (var j = 0, arrayLength = item.length; j < arrayLength; j++) {
457+
if (j in item) array[n] = item[j];
458+
n++;
459+
}
457460
} else {
458-
array.push(item);
461+
array[n++] = item;
459462
}
460463
}
464+
array.length = n;
461465
return array;
462466
}
467+
468+
function wrapNative(method) {
469+
return function() {
470+
if (arguments.length === 0) {
471+
return method.call(this, Prototype.K);
472+
} else if (arguments[0] === undefined) {
473+
var args = slice.call(arguments, 1);
474+
args.unshift(Prototype.K)
475+
return method.apply(this, args);
476+
} else {
477+
return method.apply(this, arguments);
478+
}
479+
};
480+
}
481+
482+
if (arrayProto.map) {
483+
var map = wrapNative(Array.prototype.map);
484+
} else {
485+
function map(iterator) {
486+
iterator = iterator || Prototype.K;
487+
var results = [], context = arguments[1], n = 0;
488+
489+
for (var i = 0, length = this.length; i < length; i++) {
490+
if (i in this) {
491+
results[n] = iterator.call(context, this[i], i, this);
492+
}
493+
n++;
494+
}
495+
results.length = n;
496+
return results;
497+
}
498+
}
499+
500+
if (arrayProto.filter) {
501+
var filter = Array.prototype.filter;
502+
} else {
503+
function filter(iterator) {
504+
if (!Object.isFunction(iterator)) { throw new TypeError(); }
505+
var results = [], context = arguments[1], value;
506+
507+
for (var i = 0, length = this.length; i < length; i++) {
508+
if (i in this) {
509+
value = this[i];
510+
if (iterator.call(context, value, i, this)) {
511+
results.push(value);
512+
}
513+
}
514+
}
515+
return results;
516+
}
517+
}
518+
519+
if (arrayProto.some) {
520+
var some = wrapNative(Array.prototype.some);
521+
} else {
522+
function some(iterator) {
523+
iterator = iterator || Prototype.K;
524+
var context = arguments[1];
525+
526+
for (var i = 0, length = this.length; i < length; i++) {
527+
if (i in this && iterator.call(context, this[i], i, this)) {
528+
return true;
529+
}
530+
}
531+
532+
return false;
533+
}
534+
}
535+
536+
if (arrayProto.every) {
537+
var every = wrapNative(Array.prototype.every);
538+
} else {
539+
function every(iterator) {
540+
iterator = iterator || Prototype.K;
541+
var context = arguments[1];
542+
543+
for (var i = 0, length = this.length; i < length; i++) {
544+
if (i in this && !iterator.call(context, this[i], i, this)) {
545+
return false;
546+
}
547+
}
548+
549+
return true;
550+
}
551+
}
552+
553+
if (arrayProto.reduce) {
554+
// Keep a copy of the native reduce
555+
var _reduce = arrayProto.reduce;
556+
function inject(memo, iterator) {
557+
iterator = iterator || Prototype.K;
558+
var context = arguments[2];
559+
// The iterator has to be bound, as Array.prototype.reduce
560+
// always executes the iterator in the global context.
561+
return _reduce.call(this, iterator.bind(context), memo, context);
562+
}
563+
} else {
564+
var inject = Enumerable.inject;
565+
}
463566

464567
Object.extend(arrayProto, Enumerable);
465568

@@ -468,6 +571,18 @@ Array.from = $A;
468571

469572
Object.extend(arrayProto, {
470573
_each: _each,
574+
575+
map: map,
576+
collect: map,
577+
select: filter,
578+
filter: filter,
579+
findAll: filter,
580+
some: some,
581+
any: some,
582+
every: every,
583+
all: every,
584+
inject: inject,
585+
471586
clear: clear,
472587
first: first,
473588
last: last,
@@ -486,7 +601,7 @@ Array.from = $A;
486601
// fix for opera
487602
var CONCAT_ARGUMENTS_BUGGY = (function() {
488603
return [].concat(arguments)[0][0] !== 1;
489-
})(1,2)
604+
})(1,2);
490605

491606
if (CONCAT_ARGUMENTS_BUGGY) arrayProto.concat = concat;
492607

src/prototype/lang/enumerable.js

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -107,11 +107,8 @@ var Enumerable = (function() {
107107
* has a method to do that for you.
108108
**/
109109
function each(iterator, context) {
110-
var index = 0;
111110
try {
112-
this._each(function(value) {
113-
iterator.call(context, value, index++);
114-
});
111+
this._each(iterator, context);
115112
} catch (e) {
116113
if (e != $break) throw e;
117114
}
@@ -186,9 +183,9 @@ var Enumerable = (function() {
186183
iterator = iterator || Prototype.K;
187184
var result = true;
188185
this.each(function(value, index) {
189-
result = result && !!iterator.call(context, value, index);
186+
result = result && !!iterator.call(context, value, index, this);
190187
if (!result) throw $break;
191-
});
188+
}, this);
192189
return result;
193190
}
194191

@@ -218,9 +215,9 @@ var Enumerable = (function() {
218215
iterator = iterator || Prototype.K;
219216
var result = false;
220217
this.each(function(value, index) {
221-
if (result = !!iterator.call(context, value, index))
218+
if (result = !!iterator.call(context, value, index, this))
222219
throw $break;
223-
});
220+
}, this);
224221
return result;
225222
}
226223

@@ -251,8 +248,8 @@ var Enumerable = (function() {
251248
iterator = iterator || Prototype.K;
252249
var results = [];
253250
this.each(function(value, index) {
254-
results.push(iterator.call(context, value, index));
255-
});
251+
results.push(iterator.call(context, value, index, this));
252+
}, this);
256253
return results;
257254
}
258255

@@ -274,11 +271,11 @@ var Enumerable = (function() {
274271
function detect(iterator, context) {
275272
var result;
276273
this.each(function(value, index) {
277-
if (iterator.call(context, value, index)) {
274+
if (iterator.call(context, value, index, this)) {
278275
result = value;
279276
throw $break;
280277
}
281-
});
278+
}, this);
282279
return result;
283280
}
284281

@@ -299,9 +296,9 @@ var Enumerable = (function() {
299296
function findAll(iterator, context) {
300297
var results = [];
301298
this.each(function(value, index) {
302-
if (iterator.call(context, value, index))
299+
if (iterator.call(context, value, index, this))
303300
results.push(value);
304-
});
301+
}, this);
305302
return results;
306303
}
307304

@@ -345,8 +342,8 @@ var Enumerable = (function() {
345342

346343
this.each(function(value, index) {
347344
if (filter.match(value))
348-
results.push(iterator.call(context, value, index));
349-
});
345+
results.push(iterator.call(context, value, index, this));
346+
}, this);
350347
return results;
351348
}
352349

@@ -449,8 +446,8 @@ var Enumerable = (function() {
449446
**/
450447
function inject(memo, iterator, context) {
451448
this.each(function(value, index) {
452-
memo = iterator.call(context, memo, value, index);
453-
});
449+
memo = iterator.call(context, memo, value, index, this);
450+
}, this);
454451
return memo;
455452
}
456453

@@ -514,10 +511,10 @@ var Enumerable = (function() {
514511
iterator = iterator || Prototype.K;
515512
var result;
516513
this.each(function(value, index) {
517-
value = iterator.call(context, value, index);
514+
value = iterator.call(context, value, index, this);
518515
if (result == null || value >= result)
519516
result = value;
520-
});
517+
}, this);
521518
return result;
522519
}
523520

@@ -554,10 +551,10 @@ var Enumerable = (function() {
554551
iterator = iterator || Prototype.K;
555552
var result;
556553
this.each(function(value, index) {
557-
value = iterator.call(context, value, index);
554+
value = iterator.call(context, value, index, this);
558555
if (result == null || value < result)
559556
result = value;
560-
});
557+
}, this);
561558
return result;
562559
}
563560

@@ -592,9 +589,9 @@ var Enumerable = (function() {
592589
iterator = iterator || Prototype.K;
593590
var trues = [], falses = [];
594591
this.each(function(value, index) {
595-
(iterator.call(context, value, index) ?
592+
(iterator.call(context, value, index, this) ?
596593
trues : falses).push(value);
597-
});
594+
}, this);
598595
return [trues, falses];
599596
}
600597

@@ -636,9 +633,9 @@ var Enumerable = (function() {
636633
function reject(iterator, context) {
637634
var results = [];
638635
this.each(function(value, index) {
639-
if (!iterator.call(context, value, index))
636+
if (!iterator.call(context, value, index, this))
640637
results.push(value);
641-
});
638+
}, this);
642639
return results;
643640
}
644641

@@ -668,9 +665,9 @@ var Enumerable = (function() {
668665
return this.map(function(value, index) {
669666
return {
670667
value: value,
671-
criteria: iterator.call(context, value, index)
668+
criteria: iterator.call(context, value, index, this)
672669
};
673-
}).sort(function(left, right) {
670+
}, this).sort(function(left, right) {
674671
var a = left.criteria, b = right.criteria;
675672
return a < b ? -1 : a > b ? 1 : 0;
676673
}).pluck('value');

src/prototype/lang/hash.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,12 +93,12 @@ var Hash = Class.create(Enumerable, (function() {
9393
**/
9494

9595
// Our _internal_ each
96-
function _each(iterator) {
96+
function _each(iterator, context) {
9797
for (var key in this._object) {
9898
var value = this._object[key], pair = [key, value];
9999
pair.key = key;
100100
pair.value = value;
101-
iterator(pair);
101+
iterator.call(context, pair);
102102
}
103103
}
104104

src/prototype/lang/range.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,10 @@ var ObjectRange = Class.create(Enumerable, (function() {
107107
this.exclusive = exclusive;
108108
}
109109

110-
function _each(iterator) {
110+
function _each(iterator, context) {
111111
var value = this.start;
112112
while (this.include(value)) {
113-
iterator(value);
113+
iterator.call(context, value);
114114
value = value.succ();
115115
}
116116
}

0 commit comments

Comments
 (0)