Last active
April 23, 2018 12:56
-
-
Save ro-abramov/49886581376c7523e4836b799b2b4c72 to your computer and use it in GitHub Desktop.
Generators in js can do this ? omg o_0
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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