| 'use strict'; |
| |
| var inspect = require('object-inspect'); |
| |
| var GetIntrinsic = require('get-intrinsic'); |
| |
| var $TypeError = GetIntrinsic('%TypeError%'); |
| |
| var Call = require('./Call'); |
| var Get = require('./Get'); |
| var GetIterator = require('./GetIterator'); |
| var IsCallable = require('./IsCallable'); |
| var IteratorClose = require('./IteratorClose'); |
| var IteratorStep = require('./IteratorStep'); |
| var IteratorValue = require('./IteratorValue'); |
| var Type = require('./Type'); |
| |
| // https://262.ecma-international.org/10.0//#sec-add-entries-from-iterable |
| |
| module.exports = function AddEntriesFromIterable(target, iterable, adder) { |
| if (!IsCallable(adder)) { |
| throw new $TypeError('Assertion failed: `adder` is not callable'); |
| } |
| if (iterable == null) { |
| throw new $TypeError('Assertion failed: `iterable` is present, and not nullish'); |
| } |
| var iteratorRecord = GetIterator(iterable); |
| while (true) { // eslint-disable-line no-constant-condition |
| var next = IteratorStep(iteratorRecord); |
| if (!next) { |
| return target; |
| } |
| var nextItem = IteratorValue(next); |
| if (Type(nextItem) !== 'Object') { |
| var error = new $TypeError('iterator next must return an Object, got ' + inspect(nextItem)); |
| return IteratorClose( |
| iteratorRecord, |
| function () { throw error; } // eslint-disable-line no-loop-func |
| ); |
| } |
| try { |
| var k = Get(nextItem, '0'); |
| var v = Get(nextItem, '1'); |
| Call(adder, target, [k, v]); |
| } catch (e) { |
| return IteratorClose( |
| iteratorRecord, |
| function () { throw e; } |
| ); |
| } |
| } |
| }; |