Skip to content

Instantly share code, notes, and snippets.

@ro-abramov
Last active April 23, 2018 12:56
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ro-abramov/49886581376c7523e4836b799b2b4c72 to your computer and use it in GitHub Desktop.
Save ro-abramov/49886581376c7523e4836b799b2b4c72 to your computer and use it in GitHub Desktop.
Generators in js can do this ? omg o_0
function * fibo () {
let a = 0, b = 1;
while (true) {
yield b;
[a, b] = [b, a + b];
}
}
function getIterable (iter) {
return iter.next ? iter : iter();
}
function * filter(cb, generator) {
const gen = getIterable(generator);
for (let i of gen) {
console.log(`filter ${i}`)
if (cb(i)) {
yield i
}
}
}
function * map(cb, generator) {
const gen = getIterable(generator);
for (let i of gen) {
console.log(`map ${i}`);
yield cb(i)
}
}
function take(n, generator) {
const g = generator.next ? generator : generator();
const list = [];
for (let i = 0; i < n; i++) {
list.push(g.next().value)
}
return list;
}
console.clear();
console.log(
take(5, map(
x => x + 1,
filter(x => x % 2 === 0, fibo)
))
)
// "filter 1"
// "filter 1"
// "filter 2"
// "map 2"
// "filter 3"
// "filter 5"
// "filter 8"
// "map 8"
// "filter 13"
// "filter 21"
// "filter 34"
// "map 34"
// "filter 55"
// "filter 89"
// "filter 144"
// "map 144"
// "filter 233"
// "filter 377"
// "filter 610"
// "map 610"
// [3, 9, 35, 145, 611]
function * fibo(upper_bound) {
let a = 1, b = 1;
while (b < upper_bound) {
yield b;
[a, b] = [b, a + b];
}
};
Array.from(fibo(100));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment