84e6069c60d13f47fbc0e995e83445fa90c7f0a50d7eb430d544cb4e765eb2d647458a1cbd073ac7718c6f91b6a0811821e5990d3f8328320dd42884c54991 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. 'use strict';
  2. var bind = require('../internals/function-bind-context');
  3. var call = require('../internals/function-call');
  4. var aConstructor = require('../internals/a-constructor');
  5. var toObject = require('../internals/to-object');
  6. var lengthOfArrayLike = require('../internals/length-of-array-like');
  7. var getIterator = require('../internals/get-iterator');
  8. var getIteratorMethod = require('../internals/get-iterator-method');
  9. var isArrayIteratorMethod = require('../internals/is-array-iterator-method');
  10. var isBigIntArray = require('../internals/is-big-int-array');
  11. var aTypedArrayConstructor = require('../internals/array-buffer-view-core').aTypedArrayConstructor;
  12. var toBigInt = require('../internals/to-big-int');
  13. module.exports = function from(source /* , mapfn, thisArg */) {
  14. var C = aConstructor(this);
  15. var O = toObject(source);
  16. var argumentsLength = arguments.length;
  17. var mapfn = argumentsLength > 1 ? arguments[1] : undefined;
  18. var mapping = mapfn !== undefined;
  19. var iteratorMethod = getIteratorMethod(O);
  20. var i, length, result, thisIsBigIntArray, value, step, iterator, next;
  21. if (iteratorMethod && !isArrayIteratorMethod(iteratorMethod)) {
  22. iterator = getIterator(O, iteratorMethod);
  23. next = iterator.next;
  24. O = [];
  25. while (!(step = call(next, iterator)).done) {
  26. O.push(step.value);
  27. }
  28. }
  29. if (mapping && argumentsLength > 2) {
  30. mapfn = bind(mapfn, arguments[2]);
  31. }
  32. length = lengthOfArrayLike(O);
  33. result = new (aTypedArrayConstructor(C))(length);
  34. thisIsBigIntArray = isBigIntArray(result);
  35. for (i = 0; length > i; i++) {
  36. value = mapping ? mapfn(O[i], i) : O[i];
  37. // FF30- typed arrays doesn't properly convert objects to typed array values
  38. result[i] = thisIsBigIntArray ? toBigInt(value) : +value;
  39. }
  40. return result;
  41. };