--- /dev/null
+var toObject = require('../internals/to-object');
+var toLength = require('../internals/to-length');
+var getIteratorMethod = require('../internals/get-iterator-method');
+var isArrayIteratorMethod = require('../internals/is-array-iterator-method');
+var bind = require('../internals/function-bind-context');
+var aTypedArrayConstructor = require('../internals/array-buffer-view-core').aTypedArrayConstructor;
+
+module.exports = function from(source /* , mapfn, thisArg */) {
+ 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, step, iterator, next;
+ if (iteratorMethod != undefined && !isArrayIteratorMethod(iteratorMethod)) {
+ iterator = iteratorMethod.call(O);
+ next = iterator.next;
+ O = [];
+ while (!(step = next.call(iterator)).done) {
+ O.push(step.value);
+ }
+ }
+ if (mapping && argumentsLength > 2) {
+ mapfn = bind(mapfn, arguments[2], 2);
+ }
+ length = toLength(O.length);
+ result = new (aTypedArrayConstructor(this))(length);
+ for (i = 0; length > i; i++) {
+ result[i] = mapping ? mapfn(O[i], i) : O[i];
+ }
+ return result;
+};