◆ ジェネレータを返り値がオブジェクトで done の true false を return yield で分けれるというだけに使った 

forEach で配列を処理してるときに途中で止めたいことってありますよね
何か条件を満たせたら後はやっても無駄だからしたくない とか


some や every というメソッドがあって true が返ってきたらやめるのが some で false が返ってきたらやめるのが every です
返り値はどちらも true か false で途中でやめたかどうかがわかります

でも 知りたいのは途中でやめたかじゃなくて やめたときの返り値ってことが多いです

というわけでこういうの作ってみました

several

Array.prototype.several = function(fn){
for(var i=0,k;i<this.length;i++){
k = fn(this[i], i, this)
if(k) return k.return
}
}

;[1,2,3].several(e => {
return (e&1)==0 ? {return: e*2} : false
})
// 4

some っぽい感じで several と名前をつけてます
返す値が true になる値のときに中断して 返り値の return プロパティを several の返り値にします

オブジェクトにしてるのは false や undefined を返すことができるようにするためです
続ける 続けない の情報と返す値の情報の両方をもたせるなら オブジェクトにするしかなかったです

for

ですが ジェネレータを有効利用?してわざわざオブジェクトを作らなくてもいいようにしました
window.GeneratorFunction = function*(){}.constructor

Array.prototype.for = function(fn, cancelable){
for(var i=0,l=this.length;i<l;i++){
var val = fn(this[i], i, this)
if(fn instanceof GeneratorFunction){
val = val.next()
if(cancelable && val.done) return val.value
}else{
if(cancelable && val) return val
}
}
}

;[1,9,0,3].for(e => {
console.log(e)
return e > 5 ? 100 : 0
}, true)
// 1
// 9
// < 100

;[1,9,0,3].for(function*(e){
console.log(e)
if(e > 5) {
return 100
}
yield
}, true)
// 1
// 9
// < 100

arr.for(function*(e){
return isContinue ? yield : false
})

絶対一回しか実行しないので return なら done は true で yield なら done は false です
自分でオブジェクト作らなくても yield か return で値を返せば勝手にやってくれます

1 回しか実行しないなんてジェネレータの使い方としてどうなの それ って思わなくはないですがこれのおかげでわかりやすくできました
some の true false じゃどっちがどっちだったかがよくわからなくなりますが これだと
yield は続ける
return は終わる
って直感通りで迷わずに書けます