module Euler.P002 (sumEvenFib,
                   sumEvenFib')  where
-- Problem 2
--
-- Each new term in the Fibonacci sequence is generated by adding the previous
-- two terms. By starting with 1 and 2, the first 10 terms will be:
--
--     1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
--
-- By considering the terms in the Fibonacci sequence whose values do not
-- exceed four million, find the sum of the even-valued terms.

sumEvenFib :: Int -> Int
sumEvenFib = sum . evenFib

evenFib :: Int -> [Int]
evenFib n = filter even $ takeWhile (<= n) $ map fib [1..]

fib :: (Integral a) => a -> a
fib 0 = 0
fib 1 = 1
fib n = fib (n - 1) + fib (n - 2)


sumEvenFib' :: Int -> Int
sumEvenFib' = sum . evenFib'

evenFib' :: Int -> [Int]
evenFib' n = filter even $ takeWhile (<= n) fib'

fib' :: [Int]
fib' = 0 : scanl (+) 1 fib'
