function* pi() {
function term(input, sign, divisor) {
divisor = input * ++input * ++input;
return (sign * 4) / divisor;
}
let pi = 3;
let i = 1;
while (true) {
let quotient = term(i * 2, i & 1 ? 1 : -1);
pi += quotient;
let reset = yield {
iterations: i++,
term: quotient,
result: pi
};
if (reset) {
pi = 3;
i = 1;
}
}
}