# Generating primes in ES6

Generators can be used to represent infinite streams of values. The algorithm used below is the sieve of Eratosthenes. `for-of`

loops are used to iterate over values returned from the generator.

Chrome supports both ES6 generators and `for-of`

loops but it's necessary to enable *Experimental JavaScript* at `chrome://flags/#enable-javascript-harmony`

(version 36).

Firefox supports generators as well as `for-of`

loops (version 29). To use them with custom objects they need to provide the `iterator`

method. Chrome treats the object passed to `for-of`

loop as an iterator itself and calls `next`

directly.

To run the example your browser has to support:

- ES6 generators
- for-of loops

```
// change 10 to 15 below and click "Execute"
for (var prime of take(10 /* <--here */, primes())) {
print(prime);
}
function* primes() {
var seq = numbers(2);
var prime;
while (true) {
prime = seq.next().value;
yield prime;
seq = filter(seq, prime);
}
}
function* numbers(start) {
while (true) {
yield start++;
}
}
function* take(count, seq) {
for (var i = 0; i < count; i++) {
yield seq.next().value;
}
}
function* filter(seq, prime) {
for (var num of seq) {
if (num % prime !== 0) {
yield num;
}
}
}
```

```
function print(msg) {
var li = document.createElement('LI');
li.textContent = msg;
output.appendChild(li);
}
function clear() {
output.innerHTML = '';
}
clear();
```

The same algorithm implemented using channels and goroutines can be found on the go lang example package page.

## Comments

## Revisions

- Initial version.
- Hide scaffolding code (
`clear/log/print`

).