function map(iterable, f){
let iterator = iterable[Symbol.iterator]();
return {
[Symbol.iterator](){
return this;
},
next(){
let v = iterator.next();
if(v.done){
return v;
}else{
return {
value: f(v.value)
}
}
}
}
}
console.log([...map([1,2,3,4], x => Math.pow(x, 2))]);
function filter(iterable, predicate){
let iterator = iterable[Symbol.iterator]();
let index = 0;
return {
[Symbol.iterator](){
return this;
},
next(){
for(;;){
let v = iterator.next();
if(v.done || predicate(v.value)){
return v;
}
}
}
}
};
console.log([...filter([1,2,3,4,5,6,7,8,9,10], x => x % 2 === 0)]);
function words(s){
var r = /\s+|$/g;
r.lastIndex = s.match(/[^ ]/).index;
return {
[Symbol.iterator](){
return this;
},
next(){
let start = r.lastIndex;
console.log(start)
if(start < s.length){
let match = r.exec(s);
console.log(match);
if(match){
return {
value: s.substring(start, match.index)
}
}
}
return { done: true }
}
}
}
console.log([...words(" abc def ghi! ")]);