Skip to content

Instantly share code, notes, and snippets.

@ronen-e
Created December 13, 2016 17:05
Show Gist options
  • Save ronen-e/0a1e39426cc2f49cc0a3cebe89ffee1a to your computer and use it in GitHub Desktop.
Save ronen-e/0a1e39426cc2f49cc0a3cebe89ffee1a to your computer and use it in GitHub Desktop.
Fun with generators
function* gen(param) {
if (!Array.isArray(param))
yield param;
else
for (let item of param)
yield* gen(item);
}
function* genNumbers(iterable) {
var items = gen(iterable);
for (let item of items)
if ( typeof item === 'number' && !isNaN(item))
yield item;
}
function* genEvenNumbers(iterable) {
var numbers = genNumbers(iterable);
for (let num of numbers)
if (num % 2 === 0)
yield num;
}
function* genOddNumbers(iterable) {
var numbers = genNumbers(iterable);
for (let num of numbers)
if (num % 2 !== 0)
yield num;
}
function genGenerator(assert) {
return function* generator(iterable) {
var items = gen(iterable);
for (let item of items)
if (assert(item))
yield item;
}
}
function sumArray(arr) {
let sum = 0;
const numbersIterator = genNumbers(arr);
for (let number of numbersIterator)
sum += number;
return sum;
}
function averageArray(arr) {
return sumArray(arr) / arr.length;
}
function test() {
var arr = [1,2,3,'done', 4,5, [6,7],[8,[9,[10]],'hello']];
var numbersIterator = genNumbers(arr);
for (let number of numbersIterator) {
console.log(number);
}
var genLessThen8 = genGenerator(item => item < 8);
for (let number of genLessThen8(arr)) {
console.log(number);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment