core-js
Version:
Standard library
60 lines (53 loc) • 1.78 kB
JavaScript
!function(ENTRIES, FN){
function $for(iterable, entries){
if(!(this instanceof $for))return new $for(iterable, entries);
this[ITER] = getIterator(iterable);
this[ENTRIES] = !!entries;
}
createIterator($for, 'Wrapper', function(){
return this[ITER].next();
});
var $forProto = $for[PROTOTYPE];
setIterator($forProto, function(){
return this[ITER]; // unwrap
});
function createChainIterator(next){
function Iter(I, fn, that){
this[ITER] = getIterator(I);
this[ENTRIES] = I[ENTRIES];
this[FN] = ctx(fn, that, I[ENTRIES] ? 2 : 1);
}
createIterator(Iter, 'Chain', next, $forProto);
setIterator(Iter[PROTOTYPE], returnThis); // override $forProto iterator
return Iter;
}
var MapIter = createChainIterator(function(){
var step = this[ITER].next();
return step.done ? step : iterResult(0, stepCall(this[FN], step.value, this[ENTRIES]));
});
var FilterIter = createChainIterator(function(){
for(;;){
var step = this[ITER].next();
if(step.done || stepCall(this[FN], step.value, this[ENTRIES]))return step;
}
});
assignHidden($forProto, {
of: function(fn, that){
forOf(this, this[ENTRIES], fn, that);
},
array: function(fn, that){
var result = [];
forOf(fn != undefined ? this.map(fn, that) : this, false, push, result);
return result;
},
filter: function(fn, that){
return new FilterIter(this, fn, that);
},
map: function(fn, that){
return new MapIter(this, fn, that);
}
});
$for.isIterable = isIterable;
$for.getIterator = getIterator;
$define(GLOBAL + FORCED, {$for: $for});
}('entries', safeSymbol('fn'));