package org.example.functional;

import static fj.data.List.list;
import fj.F;
import fj.data.List;

public class Main {

        private static final List<Integer> numbers = list(1, 2, 3, 4, 5);

        public static void main(String[] args) {

                List<Integer> c = numbers.map(new F<Integer, Integer>() {

                        public Integer f(Integer arg) {
                                return arg * arg;
                        }
                });

                System.out.println(makeString(c, ",")); // 1,4,9,16,25

                final int b = numbers.foldLeft(new F<Integer, F<Integer, Integer>>() {
                        public F<Integer, Integer> f(final Integer i) {
                                return new F<Integer, Integer>() {
                                        public Integer f(final Integer j) {
                                                return i + j;
                                        }
                                };
                        }
                }, 0);

                System.out.println(b);  //15

                List<Integer> gt3 = numbers.filter(new F<Integer, Boolean>() {

                        public Boolean f(Integer arg) {
                                return arg > 3;
                        }
                });

                System.out.println(makeString(gt3, ",")); // 4,5
        }

        static String makeString(final List<Integer> list, final String separator) {
                if (list != null && !list.isEmpty())
                        return subMakeString(list, separator, new StringBuilder())
                                        .toString();
                else
                        return "";
        }

        private static StringBuilder subMakeString(final List<Integer> ar,
                        final String separator, StringBuilder sb) {

                sb.append(ar.head().toString());

                if (ar.tail().isEmpty())
                        return sb;
                else {
                        sb.append(separator);
                        return subMakeString(ar.tail(), separator, sb);
                }

        }

}