public class Sum {
    public static double sum(DoubleTerm term,
			     double a,
			     DoubleNext next,
			     double b) {
	double total = 0.0;
	while (!(a > b)) {
	    total += term.value(a);
	    a = next.result(a);
	}
	return total;
    }

    public static void main(String argv[]) {
	System.out.println(
			   sum(new Identity(),
			       1.0,
			       new Increment(),
			       10.0)
			   );
	System.out.println(8.0 *
			   sum(new PiOver8Term(),
			       1.0,
			       new PiOver8Next(),
			       1000.0)
			   );
    }

    private static class PiOver8Term
	implements DoubleTerm {
	public double value(double a) {
	    return 1.0 / (a * (a + 2));
	}
    }

    private static class PiOver8Next
	implements DoubleNext {
	public double result(double a) {
	    return a + 4.0;
	}
    }
}
