Generators emulate the behavior of a closure where they wrap an initial value then can take subsequent values through next to yield something based on that initial wrapped value. This lesson walks through creating a closure then re-creating the same behavior with a generator.

function makeAdder(x) {
    return function (y) {
        return x + y
    }
}

let add2 = makeAdder(2)

//---- Generator ------
function* makeAdderGen(x: number) {
    let y = yield x;

    // because every time code pause at yield
    // it is safe to use while true
    while (true) {
        // fist doing yield 3 + x
        // .next(2) --> yield 3 + 2
        // puased
        // when .next(4) --> y = 4, console.log('y', 4)
        y = yield y + x;
        console.log('y', y)
    }
}

let add3 = makeAdderGen(3);
console.log(add3.next()); // {value: 3, done: false}
console.log(add3.next(2)); // {value: 5, done: false}
console.log(add3.next(4)); // y 4  {value: 7, done: false}
12-23 07:26