function sumSeries( generator, options ) {
	var isgenerator;
	var tolerance;
	var nextTerm;
	var counter;
	var result;
	var opts;

	opts = {};
	if ( arguments.length > 1 ) {
		opts = options;
	}
	tolerance = opts.tolerance || EPS;
	counter = opts.maxTerms || MAX_TERMS;
	result = opts.initialValue || 0;

	isgenerator = typeof generator.next === 'function';
	if ( isgenerator === true ) {
		// Case A: Iterate over generator object created by a generator function...
		for ( nextTerm of generator ) {
			result += nextTerm;
			if (
				abs(tolerance * result) >= abs(nextTerm) ||
				--counter === 0 // eslint-disable-line no-plusplus
			) {
				break;
			}
		}
	} else {
		// Case B: Repeatedly call function...
		do {
			nextTerm = generator();
			result += nextTerm;
		}
		while ( ( abs(tolerance * result) < abs(nextTerm) ) && --counter ); // eslint-disable-line no-plusplus
	}
	return result;
}
Sum the elements of the series given by the supplied function.

@param {Function} generator - series function
@param {Object} [options] - function options
@param {PositiveInteger} [options.maxTerms=1000000] - maximum number of terms to be added
@param {PositiveNumber} [options.tolerance=2.22e-16] - further terms are only added as long as the next term is greater than current term times the tolerance
@param {number} [options.initialValue=0] - initial value of the resulting sum
@returns {number} sum of all series terms

@example
var gen = geometricSeriesGenerator( 0.9 );
var out = sumSeries( gen );
// returns 10.0

function* geometricSeriesGenerator( x ) {
    var exponent = 0;
    while ( true ) {
        yield Math.pow( x, exponent );
        exponent += 1;
    }
}