public class Sum2 {
    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 *  // anonymous inner classes
	 sum(new DoubleTerm() {
		 public double value(double a) {
		     return 1.0 / (a * (a + 2));
		 }
	     },
	     1.0,
	     new DoubleNext() {
		     public double result(double a) {
			 return a + 4.0;
		     }
		 },
	     1000.0)
	 );
    }
}
