You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.5 KiB
52 lines
1.5 KiB
'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; } |
|
); |
|
} |
|
} |
|
};
|
|
|