-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathiteratorsAndGenerators.js
215 lines (155 loc) · 5.37 KB
/
iteratorsAndGenerators.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
/*Idea behind Iterator is the next element to be available w/o the need to maintain
* an index
* */
function sampleIterator(obj){
let index =0 , done = true, value, length = obj.length;
return {
next:function(){
done = (index >= length);
value = !done ?obj[index++]: undefined;
return {
done:done,
value:value
};
}
}
}
var iterator1 = sampleIterator([1, 2, 3]);
console.log(iterator1.next()); // "{ value: 1, done: false }"
console.log(iterator1.next()); // "{ value: 2, done: false }"
console.log(iterator1.next()); // "{ value: 3, done: false }"
console.log(iterator1.next()); // "{ value: undefined, done: true }"
/*Generator - to o/p an iterator*/
function *createIterator(items) {
for (let i = 0; i < items.length; i++) {
yield items[i];
}
}
let iterator2 = createIterator([1, 2, 3]);
console.log(iterator2.next()); // "{ value: 1, done: false }"
console.log(iterator2.next()); // "{ value: 2, done: false }"
console.log(iterator2.next()); // "{ value: 3, done: false }"
console.log(iterator2.next()); // "{ value: undefined, done: true }"
// for all further calls
console.log(iterator2.next()); // "{ value: undefined, done: true }"
//Creating an arrow function that is also a generator is not possible
/*Using for-of loop*/
let values = [1, 2, 3];
for (let num of values) {
console.log(num);
}
/*To check if an object is iterable*/
function isIterable(object) {
return typeof object[Symbol.iterator] === "function";
}
/*To create Iterables*/
// developer defined objects are not iterable can do -
let collection = {
items: 'name',
* itr() {
for (let item of this.items) {
yield item;
}
},
*[Symbol.iterator](){
for (let item of this.items) {
yield item;
}
}
};
var itr = collection.itr();
console.log(itr.next());//Object {value: "n", done: false}
for(let i of collection){
console.log(i); //n //a //m //e
}
/*Built-in Iterators for Array, Set, Map*/
let colors = [ "red", "green", "blue" ];
let tracking = new Set([1234, 5678, 9012, 1234]);
let data = new Map();
data.set("title", "ES 6");
data.set("format", "ebook");
data.set("1", "ebook1");
data.set(1, "ebook123");
for (let entry/*[key, value]*/ of data.entries()) { // Destructuring can be done [key, value]
console.log(value);
}
// arr.values() is not supported in Chrome, IE but FF Gecko
//https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/values
for (let value of colors.values()) {
console.log(value);
}
for (let value of tracking.values()) {
console.log(value);
}
for (let value of data.values()) {
console.log(value);
}
/*for-of to have Unicode chars*/
var message = "A𠮷B";
for (let c of message) {
console.log(c=='𠮷');
}
for(let i=0,len=message.length;i<len;i++){
console.log(message[i]=='𠮷');
} // Will treat the Unicode as two units
/*Using Spread operator to get another iterable*/
let bigNo = [100,101], smallNo = [2,3,4,5], allN0 = [0,...smallNo,...bigNo];
for(let val of allN0.entries()){
console.log(val);
}
/*Iterators with input arguments in next()*/
function *createIterator() {
let first = yield 1;
let second = yield first + 2; // 4 + 2
yield second + 3; // 5 + 3
}
let iterator = createIterator();
console.log(iterator.next()); // "{ value: 1, done: false }"
console.log(iterator.next(4)); // "{ value: 6, done: false }"
console.log(iterator.next(5)); // "{ value: 8, done: false }"
console.log(iterator.next());
// first .next()'s argument will be ignored if supplied for a reason
// next() and throw() are both help to iterate
/*Generators with return*/
function *createIterator() {
yield 1;
return 42;
}
let iterator = createIterator();
console.log(iterator.next()); // "{ value: 1, done: false }"
console.log(iterator.next()); // "{ value: 42, done: true }"
console.log(iterator.next()); // "{ value: undefined, done: true }"
/*Generator Delegation*/
function *createNumberIterator() {
yield 1;
yield 2;
return 3;
}
function *createRepeatingIterator(count) {
for (let i=0; i < count; i++) {
yield "repeat";
}
}
function *createCombinedIterator() {
let result = yield *createNumberIterator();
yield result;
yield *createRepeatingIterator(result);
}
var iterator = createCombinedIterator();
console.log(iterator.next()); // "{ value: 1, done: false }"
console.log(iterator.next()); // "{ value: 2, done: false }"
console.log(iterator.next()); // "{ value: "repeat", done: false }"
console.log(iterator.next()); // "{ value: "repeat", done: false }"
console.log(iterator.next()); // "{ value: "repeat", done: false }"
console.log(iterator.next()); // "{ value: undefined, done: true }"
/*Generator of Iterator*/
function *createNumberIterator() {
yield *[10,30];
yield 2;
return 3;
}
var anIter = createNumberIterator();
console.log( anIter.next());//{value: 10, done: false}
console.log( anIter.next());//{value: 30, done: false}
console.log( anIter.next());//{value: 2, done: false}
console.log( anIter.next());//{value: 3, done: true}