Generators JavaScript

JS
S
JavaScript

Problem: Easy to make mistakes with custom iterators (state keeping is explicitly coded) Generators are functions which can be exited and later re-entered. They also keep the state neatly. Generators will compute their yielded values on demand https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function%2A

1// Useful Use Case (Tokens Consumer)
2// ========================================================================================
3const tokens = ['xxx','yyy','zzz'];
4function* static3TokenGenerator(key) {
5  while (key < tokens.length + 1) {
6    yield tokens[key];
7    key = key + 1;
8  }
9}
10const tokenGenerator = static3TokenGenerator(0);
11// consume tokens
12console.log(tokenGenerator.next().value);
13console.log(tokenGenerator.next().value);
14console.log(tokenGenerator.next().value);
15
16
17// Simple Incrementers
18// ========================================================================================
19function* indefiniteIdMaker(){
20  let index = 0;
21  while (index < index+1)
22    yield index++;
23}
24
25function* incrementsOf10(i){
26  yield i;
27  yield i + 10;
28}
29
30
31const generatorId = indefiniteIdMaker();
32const generatorInc10 = incrementsOf10(10);
33
34console.log(generatorId.next().value); // 0
35console.log(generatorId.next().value); // 1
36
37console.log(generatorInc10.next().value); // 10
38console.log(generatorInc10.next().value); // 20
39
40
41// Yield* middleware generators
42// ========================================================================================
43function* anotherGenerator(i) {
44  yield i + 1; // 11
45}
46
47function* generator(i) {
48  yield i; // 10
49  yield* anotherGenerator(i); // 11 - it's using state = 10
50  yield* anotherGenerator(i); // 11 - it's using state = 10
51  yield i + 10; // 20
52}
53
54const gen = generator(10);
55
56console.log(gen.next().value); // 10
57console.log(gen.next().value); // 11
58console.log(gen.next().value); // 11
59console.log(gen.next().value); // 20
60console.log(gen.next().value); // undefined
61
62
63// Generator Arguments
64// ========================================================================================
65function* logGenerator() {
66  console.log(0);
67  console.log(1, yield);
68  console.log(2, yield);
69  console.log(3, yield);
70  return 55; // quits generator
71  console.log(4, yield); // unreachable
72}
73const generatorArguments = logGenerator();
74
75generatorArguments.next(); // cold start until first yield
76generatorArguments.next('test');
77generatorArguments.next('aaa');
78generatorArguments.next('bbb');
79console.log(generatorArguments.next('ccc').done); // true
80generatorArguments.next('ccc'); // empty - unreachable

Created on 2/28/2018