What I would like to do is have a closure return the same value n
amount of times.
let value = getCurrentValue([0, 315, 270, 225, 180, 135, 90], 3);
I should then get:
value() // returns 0
value() // returns 0
value() // returns 0
value() // returns 315
value() // returns 315
value() // returns 315
value() // returns 270
value() // returns 270
value() // returns 270
This is what I tried!
function getCurrentValue(values, num) {
let index = -1;
let l = values.length;
function increment() {
++index;
if (index < l) {
return values[index]
} else {
index = -1;
++index;
return values[index]
}
}
if (num) {
for (var i = 0; i < num; i++){
return increment
}
}
return increment;
}
Any help would be appreciated!
Here is my generator
solution & closure solution
// generator solution
function* getCurrentValueIter(iter, times) {
for (let i = 0; i < iter.length * times; i++) {
const cur = Math.floor(i / times);
yield iter[cur]
}
}
console.log('generate')
const valueIter = getCurrentValueIter([0, 1], 2)
for (let value of valueIter) {
console.log(value)
}
// you can also use valueIter manually
// console.log(valueIter.next().value)
// closure solution
function getCurrentValue(iter, times) {
let i = 0
function value() {
while (i < iter.length * times) {
const cur = Math.floor(i / times);
i += 1
return iter[cur]
}
}
return value
}
const value = getCurrentValue([0, 1], 2)
console.log('closure', value())
console.log(value())
console.log(value())
console.log(value())
Using just a closure - keep track of the index and the number of repeats outside the returned function, so the values persist through calls:
function getCurrentValue(arr, n) {
let index = 0;
let repeat = 0;
return function() {
if (repeat < n) {
repeat++;
} else {
repeat = 1;
index++;
}
return arr[index];
}
}
let value = getCurrentValue([0, 315, 270, 225, 180, 135, 90], 3);
console.log(value()); // returns 0
console.log(value()); // returns 0
console.log(value()); // returns 0
console.log(value()); // returns 315
console.log(value()); // returns 315
console.log(value()); // returns 315
console.log(value()); // returns 270
console.log(value()); // returns 270
console.log(value()); // returns 270
console.log(value()); // returns 225
.as-console-wrapper { max-height: 100% !important; }
The if
/else
section can be shortened by using %
to increase the repeat
value and cap it to the maximum:
function getCurrentValue(arr, n) {
let index = -1;
let repeat = -1;
return function() {
repeat = (repeat + 1) % n;
if (repeat === 0)
index++;
return arr[index];
}
}
let value = getCurrentValue([0, 315, 270, 225, 180, 135, 90], 3);
console.log(value()); // returns 0
console.log(value()); // returns 0
console.log(value()); // returns 0
console.log(value()); // returns 315
console.log(value()); // returns 315
console.log(value()); // returns 315
console.log(value()); // returns 270
console.log(value()); // returns 270
console.log(value()); // returns 270
console.log(value()); // returns 225
.as-console-wrapper { max-height: 100% !important; }