es-iterator-helpers
Advanced tools
Comparing version 1.0.3 to 1.0.4
@@ -7,18 +7,38 @@ 'use strict'; | ||
var GeneratorStart = require('./GeneratorStart'); | ||
var IsArray = require('es-abstract/2022/IsArray'); | ||
var IsCallable = require('es-abstract/2022/IsCallable'); | ||
var OrdinaryObjectCreate = require('es-abstract/2022/OrdinaryObjectCreate'); | ||
var Type = require('es-abstract/2022/Type'); | ||
var GeneratorStart = require('./GeneratorStart'); | ||
var every = require('es-abstract/helpers/every'); | ||
var callBound = require('call-bind/callBound'); | ||
var SLOT = require('internal-slot'); | ||
module.exports = function CreateIteratorFromClosure(closure, brand, proto) { | ||
var $concat = callBound('Array.prototype.concat'); | ||
var isString = function isString(slot) { | ||
return Type(slot) === 'String'; | ||
}; | ||
module.exports = function CreateIteratorFromClosure(closure, generatorBrand, proto) { | ||
if (!IsCallable(closure)) { | ||
throw new $TypeError('`closure` must be a function'); | ||
} | ||
var generator = OrdinaryObjectCreate(proto, ['[[GeneratorContext]]', '[[GeneratorBrand]]', '[[GeneratorState]]']); // steps 3, 5 | ||
SLOT.set(generator, '[[GeneratorBrand]]', brand); // step 4 | ||
if (Type(generatorBrand) !== 'String') { | ||
throw new $TypeError('`generatorBrand` must be a string'); | ||
} | ||
var extraSlots = arguments.length > 3 ? arguments[3] : []; | ||
if (arguments.length > 3) { | ||
if (!IsArray(extraSlots) || !every(extraSlots, isString)) { | ||
throw new $TypeError('`extraSlots` must be a List of String internal slot names'); | ||
} | ||
} | ||
var internalSlotsList = $concat(extraSlots, ['[[GeneratorContext]]', '[[GeneratorBrand]]', '[[GeneratorState]]']); // step 3 | ||
var generator = OrdinaryObjectCreate(proto, internalSlotsList); // steps 4, 6 | ||
SLOT.set(generator, '[[GeneratorBrand]]', generatorBrand); // step 5 | ||
SLOT.assert(closure, '[[Sentinel]]'); // our userland slot | ||
SLOT.set(generator, '[[Sentinel]]'); // our userland slot | ||
SLOT.set(generator, '[[Sentinel]]', SLOT.get(closure, '[[Sentinel]]')); // our userland slot | ||
SLOT.assert(closure, '[[CloseIfAbrupt]]'); // our second userland slot | ||
@@ -25,0 +45,0 @@ SLOT.set(generator, '[[CloseIfAbrupt]]', SLOT.get(closure, '[[CloseIfAbrupt]]')); // our second userland slot |
@@ -13,3 +13,3 @@ 'use strict'; | ||
if (Type(obj) !== 'Object') { | ||
throw new $TypeError('`obj` must be an Object'); // step 1 | ||
throw new $TypeError('Assertion failed: `obj` must be an Object'); | ||
} | ||
@@ -16,0 +16,0 @@ |
@@ -8,2 +8,10 @@ # Changelog | ||
## [v1.0.4](https://github.com/es-shims/iterator-helpers/compare/v1.0.3...v1.0.4) - 2023-03-21 | ||
### Commits | ||
- [Fix] validate arguments first [`4240029`](https://github.com/es-shims/iterator-helpers/commit/42400297454909ddccc899a012dc55bbd403eb8b) | ||
- [Fix] close underlying iterator when helper is closed [`f5372c7`](https://github.com/es-shims/iterator-helpers/commit/f5372c78cafff64bfda5849386538f806916049a) | ||
- [Tests] `Iterator`: remove an unnecessary call-bind [`7d0ba59`](https://github.com/es-shims/iterator-helpers/commit/7d0ba59f672e690b189f91e0348f6b5e00f934e1) | ||
## [v1.0.3](https://github.com/es-shims/iterator-helpers/compare/v1.0.2...v1.0.3) - 2023-03-17 | ||
@@ -10,0 +18,0 @@ |
@@ -17,2 +17,3 @@ 'use strict'; | ||
var ToNumber = require('es-abstract/2022/ToNumber'); | ||
var Type = require('es-abstract/2022/Type'); | ||
@@ -26,3 +27,6 @@ var iterHelperProto = require('../IteratorHelperPrototype'); | ||
module.exports = function drop(limit) { | ||
var iterated = GetIteratorDirect(this); // step 1 | ||
var O = this; // step 1 | ||
if (Type(O) !== 'Object') { | ||
throw new $TypeError('`this` value must be an Object'); // step 2 | ||
} | ||
@@ -34,2 +38,4 @@ var numLimit = ToNumber(limit); // step 2 | ||
var iterated = GetIteratorDirect(O); // step 4 | ||
var integerLimit = ToIntegerOrInfinity(numLimit); // step 4 | ||
@@ -85,3 +91,7 @@ if (integerLimit < 0) { | ||
return CreateIteratorFromClosure(closure, 'Iterator Helper', iterHelperProto); // step 4 | ||
var result = CreateIteratorFromClosure(closure, 'Iterator Helper', iterHelperProto, ['[[UnderlyingIterator]]']); // step 4 | ||
SLOT.set(result, '[[UnderlyingIterator]]', iterated); // step 5 | ||
return result; // step 6 | ||
}; |
@@ -16,24 +16,30 @@ 'use strict'; | ||
var ToBoolean = require('es-abstract/2022/ToBoolean'); | ||
var Type = require('es-abstract/2022/Type'); | ||
module.exports = function every(predicate) { | ||
var iterated = GetIteratorDirect(this); // step 1 | ||
var O = this; // step 1 | ||
if (Type(O) !== 'Object') { | ||
throw new $TypeError('`this` value must be an Object'); // step 2 | ||
} | ||
if (!IsCallable(predicate)) { | ||
throw new $TypeError('`predicate` must be a function'); // step 2 | ||
throw new $TypeError('`predicate` must be a function'); // step 3 | ||
} | ||
var counter = 0; // step 3 | ||
var iterated = GetIteratorDirect(O); // step 4 | ||
var counter = 0; // step 5 | ||
// eslint-disable-next-line no-constant-condition | ||
while (true) { // step 4 | ||
var next = IteratorStep(iterated); // step 4.a | ||
while (true) { // step 6 | ||
var next = IteratorStep(iterated); // step 6.a | ||
if (!next) { | ||
return true; // step 4.b | ||
return true; // step 6.b | ||
} | ||
var value = IteratorValue(next); // step 4.c | ||
var value = IteratorValue(next); // step 6.c | ||
var result; | ||
try { | ||
result = Call(predicate, void undefined, [value, counter]); // step 4.d | ||
result = Call(predicate, void undefined, [value, counter]); // step 6.d | ||
} catch (e) { | ||
// close iterator // step 4.e | ||
// close iterator // step 6.e | ||
IteratorClose( | ||
@@ -44,3 +50,3 @@ iterated, | ||
} finally { | ||
counter += 1; // step 4.g | ||
counter += 1; // step 6.g | ||
} | ||
@@ -51,5 +57,5 @@ if (!ToBoolean(result)) { | ||
NormalCompletion(false) | ||
); // step 4.f | ||
); // step 6.f | ||
} | ||
} | ||
}; |
@@ -17,2 +17,3 @@ 'use strict'; | ||
var ToBoolean = require('es-abstract/2022/ToBoolean'); | ||
var Type = require('es-abstract/2022/Type'); | ||
@@ -24,8 +25,13 @@ var iterHelperProto = require('../IteratorHelperPrototype'); | ||
module.exports = function filter(predicate) { | ||
var iterated = GetIteratorDirect(this); // step 1 | ||
var O = this; // step 1 | ||
if (Type(O) !== 'Object') { | ||
throw new $TypeError('`this` value must be an Object'); // step 2 | ||
} | ||
if (!IsCallable(predicate)) { | ||
throw new $TypeError('`predicate` must be a function'); // step 2 | ||
throw new $TypeError('`predicate` must be a function'); // step 3 | ||
} | ||
var iterated = GetIteratorDirect(O); // step 4 | ||
var closeIfAbrupt = function (abruptCompletion) { | ||
@@ -42,16 +48,16 @@ if (!(abruptCompletion instanceof CompletionRecord)) { | ||
var sentinel = {}; | ||
var counter = 0; // step 3.a | ||
var counter = 0; // step 6.a | ||
var closure = function () { | ||
// eslint-disable-next-line no-constant-condition | ||
while (true) { // step 3.b | ||
var next = IteratorStep(iterated); // step 3.b.i | ||
while (true) { // step 6.b | ||
var next = IteratorStep(iterated); // step 6.b.i | ||
if (!next) { | ||
// return void undefined; // step 3.b.ii | ||
// return void undefined; // step 6.b.ii | ||
return sentinel; | ||
} | ||
var value = IteratorValue(next); // step 3.b.iii | ||
var value = IteratorValue(next); // step 6.b.iii | ||
var selected; | ||
try { | ||
selected = Call(predicate, void undefined, [value, counter]); // step 3.b.iv | ||
// yield mapped // step 3.b.vi | ||
selected = Call(predicate, void undefined, [value, counter]); // step 6.b.iv | ||
// yield mapped // step 6.b.vi | ||
if (ToBoolean(selected)) { | ||
@@ -61,7 +67,7 @@ return value; | ||
} catch (e) { | ||
// close iterator // step 3.b.v, 3.b.vii | ||
// close iterator // step 6.b.v, 6.b.vii | ||
closeIfAbrupt(ThrowCompletion(e)); | ||
throw e; | ||
} finally { | ||
counter += 1; // step 3.b.viii | ||
counter += 1; // step 6.b.viii | ||
} | ||
@@ -73,3 +79,7 @@ } | ||
return CreateIteratorFromClosure(closure, 'Iterator Helper', iterHelperProto); // step 4 | ||
var result = CreateIteratorFromClosure(closure, 'Iterator Helper', iterHelperProto, ['[[UnderlyingIterator]]']); // step 7 | ||
SLOT.set(result, '[[UnderlyingIterator]]', iterated); // step 8 | ||
return result; // step 9 | ||
}; |
@@ -16,24 +16,31 @@ 'use strict'; | ||
var ToBoolean = require('es-abstract/2022/ToBoolean'); | ||
var Type = require('es-abstract/2022/Type'); | ||
module.exports = function find(predicate) { | ||
var iterated = GetIteratorDirect(this); // step 1 | ||
var O = this; // step 1 | ||
if (Type(O) !== 'Object') { | ||
throw new $TypeError('`this` value must be an Object'); // step 2 | ||
} | ||
if (!IsCallable(predicate)) { | ||
throw new $TypeError('`predicate` must be a function'); // step 2 | ||
throw new $TypeError('`predicate` must be a function'); // step 3 | ||
} | ||
var counter = 0; // step 3 | ||
var iterated = GetIteratorDirect(O); // step 4 | ||
var counter = 0; // step 5 | ||
// eslint-disable-next-line no-constant-condition | ||
while (true) { // step 4 | ||
var next = IteratorStep(iterated); // step 4.a | ||
while (true) { // step 6 | ||
var next = IteratorStep(iterated); // step 6.a | ||
if (!next) { | ||
return void undefined; // step 4.b | ||
return void undefined; // step 6.b | ||
} | ||
var value = IteratorValue(next); // step 4.c | ||
var value = IteratorValue(next); // step 6.c | ||
var result; | ||
try { | ||
result = Call(predicate, void undefined, [value, counter]); // step 4.d | ||
result = Call(predicate, void undefined, [value, counter]); // step 6.d | ||
} catch (e) { | ||
// close iterator // step 4.e | ||
// close iterator // step 6.e | ||
IteratorClose( | ||
@@ -44,3 +51,3 @@ iterated, | ||
} finally { | ||
counter += 1; // step 4.g | ||
counter += 1; // step 6.g | ||
} | ||
@@ -51,5 +58,5 @@ if (ToBoolean(result)) { | ||
NormalCompletion(value) | ||
); // step 4.f | ||
); // step 6.f | ||
} | ||
} | ||
}; |
@@ -17,2 +17,3 @@ 'use strict'; | ||
var ThrowCompletion = require('es-abstract/2022/ThrowCompletion'); | ||
var Type = require('es-abstract/2022/Type'); | ||
@@ -24,8 +25,13 @@ var iterHelperProto = require('../IteratorHelperPrototype'); | ||
module.exports = function flatMap(mapper) { | ||
var iterated = GetIteratorDirect(this); // step 1 | ||
var O = this; // step 1 | ||
if (Type(O) !== 'Object') { | ||
throw new $TypeError('`this` value must be an Object'); // step 2 | ||
} | ||
if (!IsCallable(mapper)) { | ||
throw new $TypeError('`mapper` must be a function'); // step 2 | ||
throw new $TypeError('`mapper` must be a function'); // step 3 | ||
} | ||
var iterated = GetIteratorDirect(O); // step 4 | ||
var closeIfAbrupt = function (abruptCompletion) { | ||
@@ -42,11 +48,11 @@ if (!(abruptCompletion instanceof CompletionRecord)) { | ||
var sentinel = {}; | ||
var counter = 0; // step 3.a | ||
var counter = 0; // step 6.a | ||
var closure = function () { | ||
// while (true) { // step 3.b | ||
var next = IteratorStep(iterated); // step 3.b.i | ||
// while (true) { // step 6.b | ||
var next = IteratorStep(iterated); // step 6.b.i | ||
if (!next) { | ||
// return void undefined; // step 3.b.ii | ||
// return void undefined; // step 6.b.ii | ||
return sentinel; | ||
} | ||
var value = IteratorValue(next); // step 3.b.iii | ||
var value = IteratorValue(next); // step 6.b.iii | ||
var mapped; | ||
@@ -56,29 +62,29 @@ var innerIterator; | ||
try { | ||
mapped = Call(mapper, void undefined, [value, counter]); // step 3.b.iv | ||
// yield mapped // step 3.b.vi | ||
innerIterator = GetIteratorFlattenable(mapped, 'sync'); // step 3.b.vi | ||
mapped = Call(mapper, void undefined, [value, counter]); // step 6.b.iv | ||
// yield mapped // step 6.b.vi | ||
innerIterator = GetIteratorFlattenable(mapped, 'sync'); // step 6.b.vi | ||
} catch (e) { | ||
closeIfAbrupt(ThrowCompletion(e)); // steps 3.b.v, 3.b.vii | ||
closeIfAbrupt(ThrowCompletion(e)); // steps 6.b.v, 6.b.vii | ||
} | ||
var innerAlive = true; // step 3.b.viii | ||
while (innerAlive) { // step 3.b.ix | ||
var innerAlive = true; // step 6.b.viii | ||
while (innerAlive) { // step 6.b.ix | ||
try { | ||
var innerNext = IteratorStep(innerIterator); // step 3.b.ix.1 | ||
var innerNext = IteratorStep(innerIterator); // step 6.b.ix.1 | ||
} catch (e) { | ||
closeIfAbrupt(ThrowCompletion(e)); // step 3.b.ix.2 | ||
closeIfAbrupt(ThrowCompletion(e)); // step 6.b.ix.2 | ||
} | ||
if (!innerNext) { | ||
innerAlive = false; // step 3.b.ix.3.a | ||
} else { // step 3.b.ix.4 | ||
innerAlive = false; // step 6.b.ix.3.a | ||
} else { // step 6.b.ix.4 | ||
var innerValue; | ||
try { | ||
innerValue = IteratorValue(innerNext); // step 3.b.ix.4.a | ||
innerValue = IteratorValue(innerNext); // step 6.b.ix.4.a | ||
} catch (e) { | ||
closeIfAbrupt(ThrowCompletion(e)); // step 3.b.ix.4.b | ||
closeIfAbrupt(ThrowCompletion(e)); // step 6.b.ix.4.b | ||
} | ||
return innerValue; // step 3.b.ix.4.c | ||
return innerValue; // step 6.b.ix.4.c | ||
} | ||
} | ||
} finally { | ||
counter += 1; // step 3.b.x | ||
counter += 1; // step 6.b.x | ||
} | ||
@@ -91,3 +97,7 @@ // } | ||
return CreateIteratorFromClosure(closure, 'Iterator Helper', iterHelperProto); // step 4 | ||
var result = CreateIteratorFromClosure(closure, 'Iterator Helper', iterHelperProto, ['[[UnderlyingIterator]]']); // step 7 | ||
SLOT.set(result, '[[UnderlyingIterator]]', iterated); // step 8 | ||
return result; // step 9 | ||
}; |
@@ -14,21 +14,27 @@ 'use strict'; | ||
var ThrowCompletion = require('es-abstract/2022/ThrowCompletion'); | ||
var Type = require('es-abstract/2022/Type'); | ||
module.exports = function forEach(fn) { | ||
var iterated = GetIteratorDirect(this); // step 1 | ||
var O = this; // step 1 | ||
if (Type(O) !== 'Object') { | ||
throw new $TypeError('`this` value must be an Object'); // step 2 | ||
} | ||
if (!IsCallable(fn)) { | ||
throw new $TypeError('`fn` must be a function'); // step 2 | ||
throw new $TypeError('`fn` must be a function'); // step 3 | ||
} | ||
var counter = 0; // step 3 | ||
var iterated = GetIteratorDirect(O); // step 4 | ||
var counter = 0; // step 5 | ||
// eslint-disable-next-line no-constant-condition | ||
while (true) { // step 4 | ||
var next = IteratorStep(iterated); // step 4.a | ||
while (true) { // step 6 | ||
var next = IteratorStep(iterated); // step 6.a | ||
if (!next) { | ||
return void undefined; // step 4.b | ||
return void undefined; // step 6.b | ||
} | ||
var value = IteratorValue(next); // step 4.c | ||
var value = IteratorValue(next); // step 6.c | ||
try { | ||
Call(fn, void undefined, [value, counter]); // step 4.d | ||
Call(fn, void undefined, [value, counter]); // step 6.d | ||
} catch (e) { | ||
@@ -38,8 +44,8 @@ IteratorClose( | ||
ThrowCompletion(e) | ||
); // steps 4.e | ||
); // steps 6.e | ||
throw e; | ||
} finally { | ||
counter += 1; // step 4.f | ||
counter += 1; // step 6.f | ||
} | ||
} | ||
}; |
@@ -16,2 +16,3 @@ 'use strict'; | ||
var ThrowCompletion = require('es-abstract/2022/ThrowCompletion'); | ||
var Type = require('es-abstract/2022/Type'); | ||
@@ -23,8 +24,13 @@ var iterHelperProto = require('../IteratorHelperPrototype'); | ||
module.exports = function map(mapper) { | ||
var iterated = GetIteratorDirect(this); // step 1 | ||
var O = this; // step 1 | ||
if (Type(O) !== 'Object') { | ||
throw new $TypeError('`this` value must be an Object'); // step 2 | ||
} | ||
if (!IsCallable(mapper)) { | ||
throw new $TypeError('`mapper` must be a function'); // step 2 | ||
throw new $TypeError('`mapper` must be a function'); // step 3 | ||
} | ||
var iterated = GetIteratorDirect(O); // step 4 | ||
var closeIfAbrupt = function (abruptCompletion) { | ||
@@ -41,23 +47,23 @@ if (!(abruptCompletion instanceof CompletionRecord)) { | ||
var sentinel = {}; | ||
var counter = 0; // step 3.a | ||
var counter = 0; // step 6.a | ||
var closure = function () { | ||
// while (true) { // step 3.b | ||
var next = IteratorStep(iterated); // step 3.b.i | ||
// while (true) { // step 6.b | ||
var next = IteratorStep(iterated); // step 6.b.i | ||
if (!next) { | ||
// return void undefined; // step 3.b.ii | ||
// return void undefined; // step 6.b.ii | ||
return sentinel; | ||
} | ||
var value = IteratorValue(next); // step 3.b.iii | ||
var value = IteratorValue(next); // step 6.b.iii | ||
var mapped; | ||
try { | ||
mapped = Call(mapper, void undefined, [value, counter]); // step 3.b.iv | ||
// yield mapped // step 3.b.vi | ||
mapped = Call(mapper, void undefined, [value, counter]); // step 6.b.iv | ||
// yield mapped // step 6.b.vi | ||
return mapped; | ||
} catch (e) { | ||
// close iterator // step 3.b.v, 3.b.vii | ||
// close iterator // step 6.b.v, 6.b.vii | ||
closeIfAbrupt(ThrowCompletion(e)); | ||
throw e; | ||
} finally { | ||
counter += 1; // step 3.b.viii | ||
counter += 1; // step 6.b.viii | ||
} | ||
@@ -69,3 +75,7 @@ // } | ||
return CreateIteratorFromClosure(closure, 'Iterator Helper', iterHelperProto); // step 4 | ||
var result = CreateIteratorFromClosure(closure, 'Iterator Helper', iterHelperProto, ['[[UnderlyingIterator]]']); // step 7 | ||
SLOT.set(result, '[[UnderlyingIterator]]', iterated); // step 8 | ||
return result; // step 9 | ||
}; |
@@ -14,22 +14,28 @@ 'use strict'; | ||
var ThrowCompletion = require('es-abstract/2022/ThrowCompletion'); | ||
var Type = require('es-abstract/2022/Type'); | ||
module.exports = function reduce(reducer) { | ||
var iterated = GetIteratorDirect(this); // step 1 | ||
var O = this; // step 1 | ||
if (Type(O) !== 'Object') { | ||
throw new $TypeError('`this` value must be an Object'); // step 2 | ||
} | ||
if (!IsCallable(reducer)) { | ||
throw new $TypeError('`reducer` must be a function'); // step 2 | ||
throw new $TypeError('`reducer` must be a function'); // step 3 | ||
} | ||
var iterated = GetIteratorDirect(O); // step 4 | ||
var accumulator; | ||
var counter; | ||
var next; | ||
if (arguments.length < 2) { // step 3 | ||
next = IteratorStep(iterated); // step 3.a | ||
if (arguments.length < 2) { // step 6 | ||
next = IteratorStep(iterated); // step 6.a | ||
if (!next) { | ||
throw new $TypeError('Reduce of empty iterator with no initial value'); // step 3.b | ||
throw new $TypeError('Reduce of empty iterator with no initial value'); // step 6.b | ||
} | ||
accumulator = IteratorValue(next); // step 3.c | ||
accumulator = IteratorValue(next); // step 6.c | ||
counter = 1; | ||
} else { // step 4 | ||
accumulator = arguments[1]; // step 4.a | ||
} else { // step 7 | ||
accumulator = arguments[1]; // step 7.a | ||
counter = 0; | ||
@@ -39,13 +45,13 @@ } | ||
// eslint-disable-next-line no-constant-condition | ||
while (true) { // step 5 | ||
next = IteratorStep(iterated); // step 5.a | ||
while (true) { // step 8 | ||
next = IteratorStep(iterated); // step 8.a | ||
if (!next) { | ||
return accumulator; // step 5.b | ||
return accumulator; // step 8.b | ||
} | ||
var value = IteratorValue(next); // step 5.c | ||
var value = IteratorValue(next); // step 8.c | ||
try { | ||
var result = Call(reducer, void undefined, [accumulator, value, counter]); // step 5.d | ||
accumulator = result; // step 5.f | ||
var result = Call(reducer, void undefined, [accumulator, value, counter]); // step 8.d | ||
accumulator = result; // step 8.f | ||
} catch (e) { | ||
// close iterator // step 5.e | ||
// close iterator // step 8.e | ||
IteratorClose( | ||
@@ -56,4 +62,4 @@ iterated, | ||
} | ||
counter += 1; // step 5.g | ||
counter += 1; // step 8.g | ||
} | ||
}; |
@@ -16,24 +16,30 @@ 'use strict'; | ||
var ToBoolean = require('es-abstract/2022/ToBoolean'); | ||
var Type = require('es-abstract/2022/Type'); | ||
module.exports = function some(predicate) { | ||
var iterated = GetIteratorDirect(this); // step 1 | ||
var O = this; // step 1 | ||
if (Type(O) !== 'Object') { | ||
throw new $TypeError('`this` value must be an Object'); // step 2 | ||
} | ||
if (!IsCallable(predicate)) { | ||
throw new $TypeError('`predicate` must be a function'); // step 2 | ||
throw new $TypeError('`predicate` must be a function'); // step 3 | ||
} | ||
var counter = 0; // step 3 | ||
var iterated = GetIteratorDirect(O); // step 4 | ||
var counter = 0; // step 5 | ||
// eslint-disable-next-line no-constant-condition | ||
while (true) { // step 4 | ||
var next = IteratorStep(iterated); // step 4.a | ||
while (true) { // step 6 | ||
var next = IteratorStep(iterated); // step 6.a | ||
if (!next) { | ||
return false; // step 4.b | ||
return false; // step 6.b | ||
} | ||
var value = IteratorValue(next); // step 4.c | ||
var value = IteratorValue(next); // step 6.c | ||
var result; | ||
try { | ||
result = Call(predicate, void undefined, [value, counter]); // step 4.d | ||
result = Call(predicate, void undefined, [value, counter]); // step 6.d | ||
} catch (e) { | ||
// close iterator // step 4.e | ||
// close iterator // step 6.e | ||
IteratorClose( | ||
@@ -44,3 +50,3 @@ iterated, | ||
} finally { | ||
counter += 1; // step 4.g | ||
counter += 1; // step 6.g | ||
} | ||
@@ -51,5 +57,5 @@ if (ToBoolean(result)) { | ||
NormalCompletion(true) | ||
); // step 4.f | ||
); // step 6.f | ||
} | ||
} | ||
}; |
@@ -17,2 +17,3 @@ 'use strict'; | ||
var ToNumber = require('es-abstract/2022/ToNumber'); | ||
var Type = require('es-abstract/2022/Type'); | ||
@@ -26,3 +27,6 @@ var iterHelperProto = require('../IteratorHelperPrototype'); | ||
module.exports = function take(limit) { | ||
var iterated = GetIteratorDirect(this); // step 1 | ||
var O = this; // step 1 | ||
if (Type(O) !== 'Object') { | ||
throw new $TypeError('`this` value must be an Object'); // step 2 | ||
} | ||
@@ -34,5 +38,7 @@ var numLimit = ToNumber(limit); // step 2 | ||
var integerLimit = ToIntegerOrInfinity(numLimit); // step 4 | ||
var iterated = GetIteratorDirect(O); // step 4 | ||
var integerLimit = ToIntegerOrInfinity(numLimit); // step 7 | ||
if (integerLimit < 0) { | ||
throw new $RangeError('`limit` must be a >= 0'); // step 5 | ||
throw new $RangeError('`limit` must be a >= 0'); // step 8 | ||
} | ||
@@ -51,7 +57,7 @@ | ||
var sentinel = {}; | ||
var remaining = integerLimit; // step 6.a | ||
var closure = function () { // step 6 | ||
// while (true) { // step 6.b | ||
if (remaining === 0) { // step 6.b.i | ||
return IteratorClose( // step 6.b.i.1 | ||
var remaining = integerLimit; // step 9.a | ||
var closure = function () { // step 9 | ||
// while (true) { // step 9.b | ||
if (remaining === 0) { // step 9.b.i | ||
return IteratorClose( // step 9.b.i.1 | ||
iterated, | ||
@@ -61,14 +67,14 @@ NormalCompletion(sentinel) | ||
} | ||
if (remaining !== Infinity) { // step 6.b.ii | ||
remaining -= 1; // step 6.b.ii.1 | ||
if (remaining !== Infinity) { // step 9.b.ii | ||
remaining -= 1; // step 9.b.ii.1 | ||
} | ||
var next = IteratorStep(iterated); // step 6.b.iii | ||
var next = IteratorStep(iterated); // step 9.b.iii | ||
if (!next) { | ||
// return void undefined; // step 6.b.iv | ||
// return void undefined; // step 9.b.iv | ||
return sentinel; | ||
} | ||
var value = IteratorValue(next); // step 3.b.iii | ||
return value; // step 3.b.iv | ||
var value = IteratorValue(next); // step 9.b.iii | ||
return value; // step 9.b.iv | ||
// } | ||
@@ -79,3 +85,7 @@ }; | ||
return CreateIteratorFromClosure(closure, 'Iterator Helper', iterHelperProto); // step 4 | ||
var result = CreateIteratorFromClosure(closure, 'Iterator Helper', iterHelperProto, ['[[UnderlyingIterator]]']); // step 7 | ||
SLOT.set(result, '[[UnderlyingIterator]]', iterated); // step 8 | ||
return result; // step 9 | ||
}; |
'use strict'; | ||
var GetIntrinsic = require('get-intrinsic'); | ||
var $TypeError = GetIntrinsic('%TypeError%'); | ||
var GetIteratorDirect = require('../aos/GetIteratorDirect'); | ||
var IteratorStep = require('../aos/IteratorStep'); | ||
var IteratorValue = require('es-abstract/2022/IteratorValue'); | ||
var Type = require('es-abstract/2022/Type'); | ||
var GetIteratorDirect = require('../aos/GetIteratorDirect'); | ||
var callBound = require('call-bind/callBound'); | ||
@@ -13,15 +17,21 @@ | ||
module.exports = function toArray() { | ||
var iterated = GetIteratorDirect(this); // step 1 | ||
var O = this; // step 1 | ||
var items = []; // step 2 | ||
if (Type(O) !== 'Object') { | ||
throw new $TypeError('`this` value must be an Object'); // step 2 | ||
} | ||
var iterated = GetIteratorDirect(O); // step 3 | ||
var items = []; // step 4 | ||
// eslint-disable-next-line no-constant-condition | ||
while (true) { // step 3 | ||
var next = IteratorStep(iterated); // step 3.a | ||
while (true) { // step 5 | ||
var next = IteratorStep(iterated); // step 5.a | ||
if (!next) { | ||
return items; // step 3.b | ||
return items; // step 5.b | ||
} | ||
var value = IteratorValue(next); // step 3.c | ||
$push(items, value); // step 3.d | ||
var value = IteratorValue(next); // step 5.c | ||
$push(items, value); // step 5.d | ||
} | ||
}; |
@@ -5,9 +5,12 @@ 'use strict'; | ||
var hasProto = require('has-proto')(); | ||
var iterProto = require('iterator.prototype'); | ||
var SLOT = require('internal-slot'); | ||
var CompletionRecord = require('es-abstract/2022/CompletionRecord'); | ||
var CreateIterResultObject = require('es-abstract/2015/CreateIterResultObject'); | ||
var GeneratorResume = require('../aos/GeneratorResume'); | ||
var GeneratorResumeAbrupt = require('../aos/GeneratorResumeAbrupt'); | ||
var IteratorClose = require('../aos/IteratorClose'); | ||
var NormalCompletion = require('es-abstract/2022/NormalCompletion'); | ||
var iterProto = require('iterator.prototype'); | ||
var implementation; | ||
@@ -21,4 +24,17 @@ if (hasProto) { | ||
'return': function () { | ||
var C = new CompletionRecord('return', void undefined); // step 1 | ||
return GeneratorResumeAbrupt(this, C, 'Iterator Helper'); | ||
var O = this; // step 1 | ||
SLOT.assert(O, '[[UnderlyingIterator]]'); // step 2 | ||
SLOT.assert(O, '[[GeneratorState]]'); // step 3 | ||
if (SLOT.get(O, '[[GeneratorState]]') === 'suspendedStart') { // step 4 | ||
SLOT.set(O, '[[GeneratorState]]', 'completed'); // step 4.a | ||
IteratorClose(SLOT.get(O, '[[UnderlyingIterator]]'), NormalCompletion('unused')); // step 4.c | ||
return CreateIterResultObject(void undefined, true); // step 4.d | ||
} | ||
var C = new CompletionRecord('return', void undefined); // step 5 | ||
return GeneratorResumeAbrupt(O, C, 'Iterator Helper'); // step 6 | ||
} | ||
@@ -25,0 +41,0 @@ }; |
{ | ||
"name": "es-iterator-helpers", | ||
"version": "1.0.3", | ||
"version": "1.0.4", | ||
"description": "An ESnext spec-compliant iterator helpers shim/polyfill/replacement that works as far down as ES3.", | ||
@@ -5,0 +5,0 @@ "main": "index.json", |
@@ -5,3 +5,2 @@ 'use strict'; | ||
var test = require('tape'); | ||
var callBind = require('call-bind'); | ||
var functionsHaveNames = require('functions-have-names')(); | ||
@@ -39,3 +38,3 @@ | ||
test('Iterator: implementation', function (t) { | ||
module.exports.tests(callBind(impl, null), 'Iterator', t); | ||
module.exports.tests(impl, 'Iterator', t); | ||
@@ -42,0 +41,0 @@ t.end(); |
@@ -27,3 +27,3 @@ 'use strict'; | ||
t['throws']( | ||
function () { drop(nonIterator); }, | ||
function () { drop(nonIterator, 0); }, | ||
TypeError, | ||
@@ -35,3 +35,3 @@ debug(nonIterator) + ' is not an Object with a callable `next` method' | ||
t['throws']( | ||
function () { drop(badNext); }, | ||
function () { drop(badNext, 0); }, | ||
TypeError, | ||
@@ -88,2 +88,124 @@ debug(badNext) + ' is not an Object with a callable `next` method' | ||
}); | ||
t.test('262: test/built-ins/Iterator/prototype/drop/return-is-forwarded', function (st) { | ||
var returnCount = 0; | ||
var makeBadIterator = function makeBadIterator() { | ||
return { | ||
next: function next() { | ||
return { | ||
done: false, | ||
value: 1 | ||
}; | ||
}, | ||
'return': function () { | ||
returnCount += 1; | ||
return {}; | ||
} | ||
}; | ||
}; | ||
var iter1 = drop(makeBadIterator(), 0); | ||
st.equal(returnCount, 0, 'iter1, before return()'); | ||
iter1['return'](); | ||
st.equal(returnCount, 1, 'iter1, after return()'); | ||
var iter2 = drop(makeBadIterator(), 1); | ||
st.equal(returnCount, 1, 'iter2, before return()'); | ||
iter2['return'](); | ||
st.equal(returnCount, 2, 'iter2, after return()'); | ||
// 5 drops (i wish i had pipeline) | ||
var iter3 = drop( | ||
drop( | ||
drop( | ||
drop( | ||
drop( | ||
makeBadIterator(), | ||
1 | ||
), | ||
1 | ||
), | ||
1 | ||
), | ||
1 | ||
), | ||
1 | ||
); | ||
st.equal(returnCount, 2, 'iter3, before return()'); | ||
iter3['return'](); | ||
st.equal(returnCount, 3, 'iter3, after return()'); | ||
st.end(); | ||
}); | ||
t.test('262: test/built-ins/Iterator/prototype/drop/return-is-not-forwarded-after-exhaustion', { skip: !hasPropertyDescriptors }, function (st) { | ||
var makeBadIterator = function makeBadIterator() { | ||
return { | ||
next: function next() { | ||
return { | ||
done: true, | ||
value: undefined | ||
}; | ||
}, | ||
'return': function () { | ||
throw new SyntaxError(); | ||
} | ||
}; | ||
}; | ||
var iter1 = drop(makeBadIterator(), 0); | ||
st['throws']( | ||
function () { iter1['return'](); }, | ||
SyntaxError, | ||
'iter1, return() throws' | ||
); | ||
iter1.next(); | ||
iter1['return'](); | ||
var iter2 = drop(makeBadIterator(), 1); | ||
st['throws']( | ||
function () { iter2['return'](); }, | ||
SyntaxError, | ||
'iter2, return() throws' | ||
); | ||
iter2.next(); | ||
iter2['return'](); | ||
// 5 drops (i wish i had pipeline) | ||
var iter3 = drop( | ||
drop( | ||
drop( | ||
drop( | ||
drop( | ||
makeBadIterator(), | ||
1 | ||
), | ||
1 | ||
), | ||
1 | ||
), | ||
1 | ||
), | ||
1 | ||
); | ||
st['throws']( | ||
function () { iter3['return'](); }, | ||
SyntaxError, | ||
'iter3, return() throws' | ||
); | ||
iter3.next(); | ||
iter3['return'](); | ||
var iter4 = drop(makeBadIterator(), 10); | ||
st['throws']( | ||
function () { iter4['return'](); }, | ||
SyntaxError, | ||
'iter4, return() throws' | ||
); | ||
iter4.next(); | ||
iter4['return'](); | ||
st.end(); | ||
}); | ||
}, | ||
@@ -90,0 +212,0 @@ index: function () { |
@@ -183,2 +183,72 @@ 'use strict'; | ||
}); | ||
t.test('262: test/built-ins/Iterator/prototype/drop/return-is-forwarded', function (st) { | ||
var returnCount = 0; | ||
var badIterator = { | ||
next: function next() { | ||
return { | ||
done: false, | ||
value: 1 | ||
}; | ||
}, | ||
'return': function () { | ||
returnCount += 1; | ||
return {}; | ||
} | ||
}; | ||
var iter1 = filter(badIterator, function () { return false; }); | ||
st.equal(returnCount, 0, 'iter1, before return()'); | ||
iter1['return'](); | ||
st.equal(returnCount, 1, 'iter1, after return()'); | ||
st.end(); | ||
}); | ||
t.test('262: test/built-ins/Iterator/prototype/drop/return-is-not-forwarded-after-exhaustion', { skip: !hasPropertyDescriptors }, function (st) { | ||
var makeBadIterator = function makeBadIterator() { | ||
return { | ||
next: function next() { | ||
return { | ||
done: true, | ||
value: undefined | ||
}; | ||
}, | ||
'return': function () { | ||
throw new SyntaxError(); | ||
} | ||
}; | ||
}; | ||
var iter1 = filter(makeBadIterator(), function () { return true; }); | ||
st['throws']( | ||
function () { iter1['return'](); }, | ||
SyntaxError, | ||
'iter1, return() throws' | ||
); | ||
iter1.next(); | ||
iter1['return'](); | ||
// 3 filters (i wish i had pipeline) | ||
var iter2 = filter( | ||
filter( | ||
filter( | ||
makeBadIterator(), | ||
function () { return true; } | ||
), | ||
function () { return true; } | ||
), | ||
function () { return true; } | ||
); | ||
st['throws']( | ||
function () { iter2['return'](); }, | ||
SyntaxError, | ||
'iter2, return() throws' | ||
); | ||
iter2.next(); | ||
iter2['return'](); | ||
st.end(); | ||
}); | ||
}, | ||
@@ -185,0 +255,0 @@ index: function () { |
@@ -26,3 +26,3 @@ 'use strict'; | ||
t['throws']( | ||
function () { take(nonIterator); }, | ||
function () { take(nonIterator, 0); }, | ||
TypeError, | ||
@@ -34,3 +34,3 @@ debug(nonIterator) + ' is not an Object with a callable `next` method' | ||
t['throws']( | ||
function () { take(badNext); }, | ||
function () { take(badNext, 0); }, | ||
TypeError, | ||
@@ -37,0 +37,0 @@ debug(badNext) + ' is not an Object with a callable `next` method' |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
132966
3160