blob: a0a5e71bd68b95ac92fc5e2091a870833a824fbb [file] [log] [blame]
Leo Repp58b9f112021-11-22 11:57:47 +01001'use strict';
2
3var inspect = require('object-inspect');
4
5var GetIntrinsic = require('get-intrinsic');
6
7var $TypeError = GetIntrinsic('%TypeError%');
8
9var Call = require('./Call');
10var Get = require('./Get');
11var GetIterator = require('./GetIterator');
12var IsCallable = require('./IsCallable');
13var IteratorClose = require('./IteratorClose');
14var IteratorStep = require('./IteratorStep');
15var IteratorValue = require('./IteratorValue');
16var Type = require('./Type');
17
18// https://262.ecma-international.org/10.0//#sec-add-entries-from-iterable
19
20module.exports = function AddEntriesFromIterable(target, iterable, adder) {
21 if (!IsCallable(adder)) {
22 throw new $TypeError('Assertion failed: `adder` is not callable');
23 }
24 if (iterable == null) {
25 throw new $TypeError('Assertion failed: `iterable` is present, and not nullish');
26 }
27 var iteratorRecord = GetIterator(iterable);
28 while (true) { // eslint-disable-line no-constant-condition
29 var next = IteratorStep(iteratorRecord);
30 if (!next) {
31 return target;
32 }
33 var nextItem = IteratorValue(next);
34 if (Type(nextItem) !== 'Object') {
35 var error = new $TypeError('iterator next must return an Object, got ' + inspect(nextItem));
36 return IteratorClose(
37 iteratorRecord,
38 function () { throw error; } // eslint-disable-line no-loop-func
39 );
40 }
41 try {
42 var k = Get(nextItem, '0');
43 var v = Get(nextItem, '1');
44 Call(adder, target, [k, v]);
45 } catch (e) {
46 return IteratorClose(
47 iteratorRecord,
48 function () { throw e; }
49 );
50 }
51 }
52};