import java.util.*;

public class Hof {
    public interface Fun1<R, A> {
	R apply(A a);
    }

    public interface Fun2<R, A1, A2> {
	R apply(A1 a1, A2 a2);
    }

    public static <T1, T2> void transform(Iterable<T1> seq,
					 List<T2> dest,
					 Fun1<T2, T1> fun
					 ) {
	for (T1 t : seq)
	    dest.add(fun.apply(t));
    }

    public static <T> T accumulate(Iterable<T> seq, T start,
				  Fun2<T, T, T> fun) {
	T accum = start;
	for (T t : seq)
	    accum = fun.apply(accum, t);
	return accum;
    }
}
