123456789101112131415161718192021222324252627282930313233343536373839404142 |
- 'use strict';
- var bind = require('../internals/function-bind-context');
- var call = require('../internals/function-call');
- var aConstructor = require('../internals/a-constructor');
- var toObject = require('../internals/to-object');
- var lengthOfArrayLike = require('../internals/length-of-array-like');
- var getIterator = require('../internals/get-iterator');
- var getIteratorMethod = require('../internals/get-iterator-method');
- var isArrayIteratorMethod = require('../internals/is-array-iterator-method');
- var isBigIntArray = require('../internals/is-big-int-array');
- var aTypedArrayConstructor = require('../internals/array-buffer-view-core').aTypedArrayConstructor;
- var toBigInt = require('../internals/to-big-int');
- module.exports = function from(source /* , mapfn, thisArg */) {
- var C = aConstructor(this);
- var O = toObject(source);
- var argumentsLength = arguments.length;
- var mapfn = argumentsLength > 1 ? arguments[1] : undefined;
- var mapping = mapfn !== undefined;
- var iteratorMethod = getIteratorMethod(O);
- var i, length, result, thisIsBigIntArray, value, step, iterator, next;
- if (iteratorMethod && !isArrayIteratorMethod(iteratorMethod)) {
- iterator = getIterator(O, iteratorMethod);
- next = iterator.next;
- O = [];
- while (!(step = call(next, iterator)).done) {
- O.push(step.value);
- }
- }
- if (mapping && argumentsLength > 2) {
- mapfn = bind(mapfn, arguments[2]);
- }
- length = lengthOfArrayLike(O);
- result = new (aTypedArrayConstructor(C))(length);
- thisIsBigIntArray = isBigIntArray(result);
- for (i = 0; length > i; i++) {
- value = mapping ? mapfn(O[i], i) : O[i];
- // FF30- typed arrays doesn't properly convert objects to typed array values
- result[i] = thisIsBigIntArray ? toBigInt(value) : +value;
- }
- return result;
- };
|