Skip to content

Commit

Permalink
add some, every, find
Browse files Browse the repository at this point in the history
  • Loading branch information
devsnek committed May 24, 2019
1 parent c99ca9c commit dabd9cd
Show file tree
Hide file tree
Showing 2 changed files with 86 additions and 6 deletions.
49 changes: 46 additions & 3 deletions polyfill.js
Original file line number Diff line number Diff line change
Expand Up @@ -501,15 +501,58 @@ Iterator.syncPrototype.collect = function collect() {

Iterator.syncPrototype.forEach = function forEach(fn) {
const iterated = GetIteratorDirect(this);
let index = 0;
while (true) {
const next = ES.IteratorStep(iterated);
if (next === false) {
return undefined;
}
const value = ES.IteratorValue(next);
ES.Call(fn, undefined, [value, index]);
index += 1;
ES.Call(fn, undefined, [value]);
}
};

Iterator.syncPrototype.some = function some(fn) {
const iterated = GetIteratorDirect(this);
while (true) {
const next = ES.IteratorStep(iterated);
if (next === false) {
return false;
}
const value = ES.IteratorValue(next);
const result = ES.ToBoolean(ES.Call(fn, undefined, [value]));
if (result === true) {
return true;
}
}
};

Iterator.syncPrototype.every = function every(fn) {
const iterated = GetIteratorDirect(this);
while (true) {
const next = ES.IteratorStep(iterated);
if (next === false) {
return true;
}
const value = ES.IteratorValue(next);
const result = ES.ToBoolean(ES.Call(fn, undefined, [value]));
if (result === false) {
return false;
}
}
};

Iterator.syncPrototype.find = function find(fn) {
const iterated = GetIteratorDirect(this);
while (true) {
const next = ES.IteratorStep(iterated);
if (next === false) {
return undefined;
}
const value = ES.IteratorValue(next);
const result = ES.ToBoolean(ES.Call(fn, undefined, [value]));
if (result === true) {
return value;
}
}
};

Expand Down
43 changes: 40 additions & 3 deletions spec.html
Original file line number Diff line number Diff line change
Expand Up @@ -539,13 +539,50 @@ <h1>%IteratorPrototype%.collect ( )</h1>
<h1>%IteratorPrototype%.forEach ( _fn_ )</h1>
<emu-alg>
1. Let _iterated_ be ? GetIteratorDirect(*this* value).
1. Let _index_ be *0*.
1. Repeat,
1. Let _next_ be ? IteratorStep(_iterated_).
1. If _next_ is *false*, return *undefined*.
1. Let _value_ be ? IteratorValue(_next_).
1. Perform ? Call(_fn_, *undefined*, &laquo; _value_, _index_ &raquo;).
1. Set _index_ to _index_ + *1*.
1. Perform ? Call(_fn_, *undefined*, &laquo; _value_ &raquo;).
</emu-alg>
</emu-clause>

<emu-clause id="sec-iteratorprototype-some">
<h1>%IteratorPrototype%.some ( _fn_ )</h1>
<emu-alg>
1. Let _iterated_ be ? GetIteratorDirect(*this* value).
1. Repeat,
1. Let _next_ be ? IteratorStep(_iterated_).
1. If _next_ is *false*, return *false*.
1. Let _value_ be ? IteratorValue(_next_).
1. Let _result_ be ToBoolean(? Call(_fn_, *undefined*, &laquo; _value_ &raquo;)).
1. If _result_ is *true*, return *true*.
</emu-alg>
</emu-clause>

<emu-clause id="sec-iteratorprototype-every">
<h1>%IteratorPrototype%.every ( _fn_ )</h1>
<emu-alg>
1. Let _iterated_ be ? GetIteratorDirect(*this* value).
1. Repeat,
1. Let _next_ be ? IteratorStep(_iterated_).
1. If _next_ is *false*, return *true*.
1. Let _value_ be ? IteratorValue(_next_).
1. Let _result_ be ToBoolean(? Call(_fn_, *undefined*, &laquo; _value_ &raquo;)).
1. If _result_ is *false*, return *false*.
</emu-alg>
</emu-clause>

<emu-clause id="sec-iteratorprototype-find">
<h1>%IteratorPrototype%.find ( _fn_ )</h1>
<emu-alg>
1. Let _iterated_ be ? GetIteratorDirect(*this* value).
1. Repeat,
1. Let _next_ be ? IteratorStep(_iterated_).
1. If _next_ is *false*, return *undefined*.
1. Let _value_ be ? IteratorValue(_next_).
1. Let _result_ be ToBoolean(? Call(_fn_, *undefined*, &laquo; _value_ &raquo;)).
1. If _result_ is *true*, return _value_.
</emu-alg>
</emu-clause>
</emu-clause>
Expand Down

0 comments on commit dabd9cd

Please sign in to comment.