import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * @author Anastasiya Solodkaya.
 */
public class IteratedLoop1 {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException {
        MethodHandle h1 = MethodHandles.iteratedLoop(null, EmptyIterator.initI, EmptyIterator.bodyIStringIList);
        System.out.println(h1.type());
        MethodHandle h2 = MethodHandles.iteratedLoop(EmptyIterator.iteratorHandle, EmptyIterator.initI, EmptyIterator.bodyIStringIList);
        System.out.println(h2.type());
    }

    /**
     * Class contains set of methods for generating empty iterating loop.
     */
    private static class EmptyIterator {
        static int bodyIStringIList(String e, int v, List<String> s) {
            return 0;
        }

        static int init() {
            return 0;
        }

        static Iterator<String> iterator(List<String> l) {
            return l.iterator();
        }

        /**
         * Method handle for {@link EmptyIterator#bodyIStringI(String, int)} not bound to any instance
         */
        private static MethodHandle bodyIStringIList;
        /**
         * Method handle for {@link EmptyIterator#init()} not bound to any instance
         */
        private static MethodHandle initI;
        private static MethodHandle iteratorHandle;

        static {
            try {
                initI = MethodHandles.lookup().findStatic(EmptyIterator.class, "init",
                        MethodType.methodType(int.class));
                bodyIStringIList = MethodHandles.lookup().findStatic(EmptyIterator.class, "bodyIStringIList",
                        MethodType.methodType(int.class, String.class, int.class, List.class));
                iteratorHandle = MethodHandles.lookup().findStatic(EmptyIterator.class, "iterator",
                        MethodType.methodType(Iterator.class, List.class));
            } catch (NoSuchMethodException | IllegalAccessException e) {
                e.printStackTrace();
            }
        }

    }


}
