package fj.demo.euler;
import fj.F1Functions;
import fj.F2;
import fj.F2Functions;
import fj.data.Stream;
import static fj.data.Stream.cons;
import static fj.function.Integers.even;
import static fj.function.Integers.sum;
import static fj.Ord.intOrd;
import static java.lang.System.out;
/**
* Find the sum of all the even-valued terms in the Fibonacci sequence which do not exceed four million.
*/
public class Problem2 {
public static void main(final String[] args) {
java7();
java8();
}
static void java7() {
final Stream<Integer> fibs = new F2<Integer, Integer, Stream<Integer>>() {
public Stream<Integer> f(final Integer a, final Integer b) {
return cons(a, F1Functions.lazy(F2Functions.curry(this).f(b)).f(a + b));
}
}.f(1, 2);
out.println(sum(fibs.filter(even).takeWhile(intOrd.isLessThan(4000001)).toList()));
}
static F2<Integer, Integer, Stream<Integer>> fibsJava8 = (a, b) -> cons(a, F1Functions.lazy(F2Functions.curry(Problem2.fibsJava8).f(b)).f(a + b));
static void java8() {
out.println(sum(fibsJava8.f(1, 2).filter(even).takeWhile(intOrd.isLessThan(4000001)).toList()));
}
}