Skip to content
Snippets Groups Projects
Commit a7ceebeb authored by Michael J. Ryan's avatar Michael J. Ryan
Browse files

Update array.js formatting

Autoformatted via prettier with settings below, this is so additional polyfill matches can be used to match formatting in future PRs for polyfills, as well as full formatting tooling for .js files.

```yaml
tabWidth: 4
useTabs: true
singleQuote: true
trailingComma: "es5"
```
parent 8eaa996b
No related branches found
No related tags found
2 merge requests!463MRC mods by Codefenix (2024-10-20),!120Update array.js formatting
...@@ -2,334 +2,355 @@ ...@@ -2,334 +2,355 @@
/** /**
* Polyfills for newer Array methods * Polyfills for newer Array methods
* Lifted from MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array * Lifted from MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array
* *
* This is a legacy-style library and should be loaded with: * This is a legacy-style library and should be loaded with:
* load('array.js'); * load('array.js');
*/ */
if (!Array.from) { if (!Array.from) {
Array.from = (function () { Array.from = (function () {
var toStr = Object.prototype.toString; var toStr = Object.prototype.toString;
var isCallable = function (fn) { var isCallable = function (fn) {
return typeof fn === 'function' || toStr.call(fn) === '[object Function]'; return (
}; typeof fn === 'function' ||
var toInteger = function (value) { toStr.call(fn) === '[object Function]'
var number = Number(value); );
if (isNaN(number)) return 0; };
if (number === 0 || !isFinite(number)) return number; var toInteger = function (value) {
return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number)); var number = Number(value);
}; if (isNaN(number)) return 0;
var maxSafeInteger = Math.pow(2, 53) - 1; if (number === 0 || !isFinite(number)) return number;
var toLength = function (value) { return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));
var len = toInteger(value); };
return Math.min(Math.max(len, 0), maxSafeInteger); var maxSafeInteger = Math.pow(2, 53) - 1;
}; var toLength = function (value) {
var len = toInteger(value);
// The length property of the from method is 1. return Math.min(Math.max(len, 0), maxSafeInteger);
return function from(arrayLike/*, mapFn, thisArg */) { };
// 1. Let C be the this value.
var C = this; // The length property of the from method is 1.
return function from(arrayLike /*, mapFn, thisArg */) {
// 2. Let items be ToObject(arrayLike). // 1. Let C be the this value.
var items = Object(arrayLike); var C = this;
// 3. ReturnIfAbrupt(items). // 2. Let items be ToObject(arrayLike).
if (arrayLike == null) { var items = Object(arrayLike);
throw new TypeError('Array.from requires an array-like object - not null or undefined');
} // 3. ReturnIfAbrupt(items).
if (arrayLike == null) {
// 4. If mapfn is undefined, then let mapping be false. throw new TypeError(
var mapFn = arguments.length > 1 ? arguments[1] : void undefined; 'Array.from requires an array-like object - not null or undefined'
var T; );
if (typeof mapFn !== 'undefined') { }
// 5. else
// 5. a If IsCallable(mapfn) is false, throw a TypeError exception. // 4. If mapfn is undefined, then let mapping be false.
if (!isCallable(mapFn)) { var mapFn = arguments.length > 1 ? arguments[1] : void undefined;
throw new TypeError('Array.from: when provided, the second argument must be a function'); var T;
} if (typeof mapFn !== 'undefined') {
// 5. else
// 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined. // 5. a If IsCallable(mapfn) is false, throw a TypeError exception.
if (arguments.length > 2) T = arguments[2]; if (!isCallable(mapFn)) {
} throw new TypeError(
'Array.from: when provided, the second argument must be a function'
// 10. Let lenValue be Get(items, "length"). );
// 11. Let len be ToLength(lenValue). }
var len = toLength(items.length);
// 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined.
// 13. If IsConstructor(C) is true, then if (arguments.length > 2) T = arguments[2];
// 13. a. Let A be the result of calling the [[Construct]] internal method }
// of C with an argument list containing the single item len.
// 14. a. Else, Let A be ArrayCreate(len). // 10. Let lenValue be Get(items, "length").
var A = isCallable(C) ? Object(new C(len)) : new Array(len); // 11. Let len be ToLength(lenValue).
var len = toLength(items.length);
// 16. Let k be 0.
var k = 0; // 13. If IsConstructor(C) is true, then
// 17. Repeat, while k < len… (also steps a - h) // 13. a. Let A be the result of calling the [[Construct]] internal method
var kValue; // of C with an argument list containing the single item len.
while (k < len) { // 14. a. Else, Let A be ArrayCreate(len).
kValue = items[k]; var A = isCallable(C) ? Object(new C(len)) : new Array(len);
if (mapFn) {
A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k); // 16. Let k be 0.
} else { var k = 0;
A[k] = kValue; // 17. Repeat, while k < len… (also steps a - h)
} var kValue;
k += 1; while (k < len) {
} kValue = items[k];
// 18. Let putStatus be Put(A, "length", len, true). if (mapFn) {
A.length = len; A[k] =
// 20. Return A. typeof T === 'undefined'
return A; ? mapFn(kValue, k)
}; : mapFn.call(T, kValue, k);
}()); } else {
A[k] = kValue;
}
k += 1;
}
// 18. Let putStatus be Put(A, "length", len, true).
A.length = len;
// 20. Return A.
return A;
};
})();
} }
if (!Array.of) { if (!Array.of) {
Array.of = function() { Array.of = function () {
return Array.prototype.slice.call(arguments); return Array.prototype.slice.call(arguments);
}; };
} }
if (!Array.prototype.copyWithin) { if (!Array.prototype.copyWithin) {
Object.defineProperty(Array.prototype, 'copyWithin', { Object.defineProperty(Array.prototype, 'copyWithin', {
value: function (target, start/*, end*/) { value: function (target, start /*, end*/) {
// Steps 1-2. // Steps 1-2.
if (this == null) { if (this == null) {
throw new TypeError('this is null or not defined'); throw new TypeError('this is null or not defined');
} }
var O = Object(this); var O = Object(this);
// Steps 3-5. // Steps 3-5.
var len = O.length >>> 0; var len = O.length >>> 0;
// Steps 6-8. // Steps 6-8.
var relativeTarget = target >> 0; var relativeTarget = target >> 0;
var to = relativeTarget < 0 ? var to =
Math.max(len + relativeTarget, 0) : relativeTarget < 0
Math.min(relativeTarget, len); ? Math.max(len + relativeTarget, 0)
: Math.min(relativeTarget, len);
// Steps 9-11.
var relativeStart = start >> 0; // Steps 9-11.
var relativeStart = start >> 0;
var from = relativeStart < 0 ?
Math.max(len + relativeStart, 0) : var from =
Math.min(relativeStart, len); relativeStart < 0
? Math.max(len + relativeStart, 0)
// Steps 12-14. : Math.min(relativeStart, len);
var end = arguments[2];
var relativeEnd = end === undefined ? len : end >> 0; // Steps 12-14.
var end = arguments[2];
var final = relativeEnd < 0 ? var relativeEnd = end === undefined ? len : end >> 0;
Math.max(len + relativeEnd, 0) :
Math.min(relativeEnd, len); var final =
relativeEnd < 0
// Step 15. ? Math.max(len + relativeEnd, 0)
var count = Math.min(final - from, len - to); : Math.min(relativeEnd, len);
// Steps 16-17. // Step 15.
var direction = 1; var count = Math.min(final - from, len - to);
if (from < to && to < (from + count)) { // Steps 16-17.
direction = -1; var direction = 1;
from += count - 1;
to += count - 1; if (from < to && to < from + count) {
} direction = -1;
from += count - 1;
// Step 18. to += count - 1;
while (count > 0) { }
if (from in O) {
O[to] = O[from]; // Step 18.
} else { while (count > 0) {
delete O[to]; if (from in O) {
} O[to] = O[from];
from += direction; } else {
to += direction; delete O[to];
count--; }
} from += direction;
to += direction;
// Step 19. count--;
return O; }
},
configurable: true, // Step 19.
writable: true return O;
}); },
configurable: true,
writable: true,
});
} }
if (!Array.prototype.fill) { if (!Array.prototype.fill) {
Object.defineProperty(Array.prototype, 'fill', { Object.defineProperty(Array.prototype, 'fill', {
value: function (value) { value: function (value) {
// Steps 1-2. // Steps 1-2.
if (this == null) throw new TypeError('this is null or not defined'); if (this == null)
throw new TypeError('this is null or not defined');
var O = Object(this);
var O = Object(this);
// Steps 3-5.
var len = O.length >>> 0; // Steps 3-5.
var len = O.length >>> 0;
// Steps 6-7.
var start = arguments[1]; // Steps 6-7.
var relativeStart = start >> 0; var start = arguments[1];
var relativeStart = start >> 0;
// Step 8.
var k = relativeStart < 0 ? // Step 8.
Math.max(len + relativeStart, 0) : var k =
Math.min(relativeStart, len); relativeStart < 0
? Math.max(len + relativeStart, 0)
// Steps 9-10. : Math.min(relativeStart, len);
var end = arguments[2];
var relativeEnd = end === undefined ? // Steps 9-10.
len : end >> 0; var end = arguments[2];
var relativeEnd = end === undefined ? len : end >> 0;
// Step 11.
var final = relativeEnd < 0 ? // Step 11.
Math.max(len + relativeEnd, 0) : var final =
Math.min(relativeEnd, len); relativeEnd < 0
? Math.max(len + relativeEnd, 0)
// Step 12. : Math.min(relativeEnd, len);
while (k < final) {
O[k] = value; // Step 12.
k++; while (k < final) {
} O[k] = value;
k++;
// Step 13. }
return O;
} // Step 13.
}); return O;
},
});
} }
// https://tc39.github.io/ecma262/#sec-array.prototype.find // https://tc39.github.io/ecma262/#sec-array.prototype.find
if (!Array.prototype.find) { if (!Array.prototype.find) {
Object.defineProperty(Array.prototype, 'find', { Object.defineProperty(Array.prototype, 'find', {
value: function (predicate) { value: function (predicate) {
// 1. Let O be ? ToObject(this value). // 1. Let O be ? ToObject(this value).
if (this == null) { if (this == null) {
throw new TypeError('"this" is null or not defined'); throw new TypeError('"this" is null or not defined');
} }
var o = Object(this); var o = Object(this);
// 2. Let len be ? ToLength(? Get(O, "length")). // 2. Let len be ? ToLength(? Get(O, "length")).
var len = o.length >>> 0; var len = o.length >>> 0;
// 3. If IsCallable(predicate) is false, throw a TypeError exception. // 3. If IsCallable(predicate) is false, throw a TypeError exception.
if (typeof predicate !== 'function') { if (typeof predicate !== 'function') {
throw new TypeError('predicate must be a function'); throw new TypeError('predicate must be a function');
} }
// 4. If thisArg was supplied, let T be thisArg; else let T be undefined. // 4. If thisArg was supplied, let T be thisArg; else let T be undefined.
var thisArg = arguments[1]; var thisArg = arguments[1];
// 5. Let k be 0. // 5. Let k be 0.
var k = 0; var k = 0;
// 6. Repeat, while k < len // 6. Repeat, while k < len
while (k < len) { while (k < len) {
// a. Let Pk be ! ToString(k). // a. Let Pk be ! ToString(k).
// b. Let kValue be ? Get(O, Pk). // b. Let kValue be ? Get(O, Pk).
// c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)). // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).
// d. If testResult is true, return kValue. // d. If testResult is true, return kValue.
var kValue = o[k]; var kValue = o[k];
if (predicate.call(thisArg, kValue, k, o)) return kValue; if (predicate.call(thisArg, kValue, k, o)) return kValue;
// e. Increase k by 1. // e. Increase k by 1.
k++; k++;
} }
// 7. Return undefined. // 7. Return undefined.
return undefined; return undefined;
}, },
configurable: true, configurable: true,
writable: true writable: true,
}); });
} }
// https://tc39.github.io/ecma262/#sec-array.prototype.findindex // https://tc39.github.io/ecma262/#sec-array.prototype.findindex
if (!Array.prototype.findIndex) { if (!Array.prototype.findIndex) {
Object.defineProperty(Array.prototype, 'findIndex', { Object.defineProperty(Array.prototype, 'findIndex', {
value: function (predicate) { value: function (predicate) {
// 1. Let O be ? ToObject(this value). // 1. Let O be ? ToObject(this value).
if (this == null) { if (this == null) {
throw new TypeError('"this" is null or not defined'); throw new TypeError('"this" is null or not defined');
} }
var o = Object(this); var o = Object(this);
// 2. Let len be ? ToLength(? Get(O, "length")). // 2. Let len be ? ToLength(? Get(O, "length")).
var len = o.length >>> 0; var len = o.length >>> 0;
// 3. If IsCallable(predicate) is false, throw a TypeError exception. // 3. If IsCallable(predicate) is false, throw a TypeError exception.
if (typeof predicate !== 'function') { if (typeof predicate !== 'function') {
throw new TypeError('predicate must be a function'); throw new TypeError('predicate must be a function');
} }
// 4. If thisArg was supplied, let T be thisArg; else let T be undefined. // 4. If thisArg was supplied, let T be thisArg; else let T be undefined.
var thisArg = arguments[1]; var thisArg = arguments[1];
// 5. Let k be 0. // 5. Let k be 0.
var k = 0; var k = 0;
// 6. Repeat, while k < len // 6. Repeat, while k < len
while (k < len) { while (k < len) {
// a. Let Pk be ! ToString(k). // a. Let Pk be ! ToString(k).
// b. Let kValue be ? Get(O, Pk). // b. Let kValue be ? Get(O, Pk).
// c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)). // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).
// d. If testResult is true, return k. // d. If testResult is true, return k.
var kValue = o[k]; var kValue = o[k];
if (predicate.call(thisArg, kValue, k, o)) return k; if (predicate.call(thisArg, kValue, k, o)) return k;
// e. Increase k by 1. // e. Increase k by 1.
k++; k++;
} }
// 7. Return -1. // 7. Return -1.
return -1; return -1;
}, },
configurable: true, configurable: true,
writable: true writable: true,
}); });
} }
// From https://github.com/latusinski/polyfill-array-includes/blob/master/array-includes.js // From https://github.com/latusinski/polyfill-array-includes/blob/master/array-includes.js
if (!Array.prototype.includes) { if (!Array.prototype.includes) {
Object.defineProperty(Array.prototype, 'includes', { Object.defineProperty(Array.prototype, 'includes', {
value: function (searchElement, fromIndex) { value: function (searchElement, fromIndex) {
// 1. Let O be ? ToObject(this value). // 1. Let O be ? ToObject(this value).
if (this == null) throw new TypeError('"this" is null or not defined'); if (this == null)
throw new TypeError('"this" is null or not defined');
var o = Object(this);
var o = Object(this);
// 2. Let len be ? ToLength(? Get(O, "length")).
var len = o.length >>> 0; // 2. Let len be ? ToLength(? Get(O, "length")).
var len = o.length >>> 0;
// 3. If len is 0, return false.
if (len === 0) return false; // 3. If len is 0, return false.
if (len === 0) return false;
// 4. Let n be ? ToInteger(fromIndex).
// (If fromIndex is undefined, this step produces the value 0.) // 4. Let n be ? ToInteger(fromIndex).
var n = fromIndex | 0; // (If fromIndex is undefined, this step produces the value 0.)
var n = fromIndex | 0;
// 5. If n ≥ 0, then
// a. Let k be n. // 5. If n ≥ 0, then
// 6. Else n < 0, // a. Let k be n.
// a. Let k be len + n. // 6. Else n < 0,
// b. If k < 0, let k be 0. // a. Let k be len + n.
var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); // b. If k < 0, let k be 0.
var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
function sameValueZero(x, y) {
return x === y || (typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y)); function sameValueZero(x, y) {
} return (
x === y ||
// 7. Repeat, while k < len (typeof x === 'number' &&
while (k < len) { typeof y === 'number' &&
// a. Let elementK be the result of ? Get(O, ! ToString(k)). isNaN(x) &&
// b. If SameValueZero(searchElement, elementK) is true, return true. isNaN(y))
// c. Increase k by 1. );
if (sameValueZero(o[k], searchElement)) return true; }
k++;
} // 7. Repeat, while k < len
while (k < len) {
// 8. Return false // a. Let elementK be the result of ? Get(O, ! ToString(k)).
return false; // b. If SameValueZero(searchElement, elementK) is true, return true.
} // c. Increase k by 1.
}); if (sameValueZero(o[k], searchElement)) return true;
k++;
}
// 8. Return false
return false;
},
});
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment