Skip to content

Instantly share code, notes, and snippets.

@PaulMaynard
Last active May 2, 2016 16:13
Show Gist options
  • Save PaulMaynard/c4c509889ba8869bf320 to your computer and use it in GitHub Desktop.
Save PaulMaynard/c4c509889ba8869bf320 to your computer and use it in GitHub Desktop.
Generator and Iterator manipulation
/**
* Usage examples:
* // Even squares of numbers between 1-10
* _(_.filter(_.map(_.range(1, 10), x => x * x), x => x % 2 === 0))
* // 10 coin flips
* _(_.take(_.map(_.func(Math.random), n => n < 0.5), 10))
* // first 100 Fibonacci numbers (assuming already defined generator)
* _(_.take(fibonacci(), 100))
* // Convert pseudo-array to array
* _(_({ 0: 1, 1: 2, length: 2} ))
*/
window._ = window.eater = (function(){'use strict';
function eater(it) {
if(typeof it === 'function') {
return eater.func(it);
} else if(it[Symbol.iterator]) {
return [...it];
} else if(it.next) {
return eater.take(it);
} else if(typeof it.length === 'number') {
return eater.loop(it);
} else if(it[Symbol.iterator]) {
return [...it];
} else if(it.next) {
return eater.take(it);
} else {
return eater.fill(it);
}
}
Object.assign(eater, {
/* Creators */
*range(start = Infinity, end = null) {
if(end == null) {
[start, end] = [1, start];
}
for(var i = start; i <= end; i++) {
yield i;
}
},
*fill(val) {
while(true) {
yield val;
}
},
*func(fn, ...args) {
while(true) {
yield fn(...args);
}
},
*loop(it) {
for(var i = 0; i < it.length; i++) {
yield it[i];
}
},
*join(...its) {
for(var it of its) {
yield* it;
}
},
/* Accessors */
*take(iter, amt = Infinity) {
var it = iter[Symbol.iterator]? iter[Symbol.iterator]() : iter
for(var i = 0, n; i < amt && !((n = it.next()).done); i++) {
yield n.value;
}
},
*each(it, fun) {
for(var i of it) {
fun(i);
yield i;
}
},
get(it) {
return it.next().value;
},
/* Manipulators */
*map(it, fun) {
for(var i of it) {
yield fun(i);
}
},
*filter(it, fun) {
for(var i of it) {
if(fun(i)) {
yield i;
}
}
}
});
return eater;
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment