| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| /* eslint-disable */ |
| |
| // Production steps of ECMA-262, Edition 6, 22.1.2.1 |
| // Reference: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.from |
| |
| /* istanbul ignore if */ |
| if (!Array.from) { |
| Array.from = (function() { |
| var toStr = Object.prototype.toString; |
| var isCallable = function(fn) { |
| return typeof fn === 'function' || toStr.call(fn) === '[object Function]'; |
| }; |
| var toInteger = function(value) { |
| var number = Number(value); |
| if (isNaN(number)) { |
| return 0; |
| } |
| if (number === 0 || !isFinite(number)) { |
| return number; |
| } |
| return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number)); |
| }; |
| var maxSafeInteger = Math.pow(2, 53) - 1; |
| var toLength = function(value) { |
| var len = toInteger(value); |
| return Math.min(Math.max(len, 0), maxSafeInteger); |
| }; |
| |
| // The length property of the from method is 1. |
| return function from(arrayLike/*, mapFn, thisArg */) { |
| // 1. Let C be the this value. |
| var C = this; |
| |
| // 2. Let items be ToObject(arrayLike). |
| var items = Object(arrayLike); |
| |
| // 3. ReturnIfAbrupt(items). |
| if (arrayLike == null) { |
| throw new TypeError('Array.from requires an array-like object - not null or undefined'); |
| } |
| |
| // 4. If mapfn is undefined, then let mapping be false. |
| var mapFn = arguments.length > 1 ? arguments[1] : void undefined; |
| var T; |
| if (typeof mapFn !== 'undefined') { |
| // 5. else |
| // 5. a If IsCallable(mapfn) is false, throw a TypeError exception. |
| if (!isCallable(mapFn)) { |
| throw new TypeError('Array.from: when provided, the second argument must be a function'); |
| } |
| |
| // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined. |
| if (arguments.length > 2) { |
| T = arguments[2]; |
| } |
| } |
| |
| // 10. Let lenValue be Get(items, "length"). |
| // 11. Let len be ToLength(lenValue). |
| var len = toLength(items.length); |
| |
| // 13. If IsConstructor(C) is true, then |
| // 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). |
| var A = isCallable(C) ? Object(new C(len)) : new Array(len); |
| |
| // 16. Let k be 0. |
| var k = 0; |
| // 17. Repeat, while k < len… (also steps a - h) |
| var kValue; |
| while (k < len) { |
| kValue = items[k]; |
| if (mapFn) { |
| A[k] = typeof T === 'undefined' ? 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; |
| }; |
| }()); |
| } |