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 IteratedLoop10 {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException {
        MethodHandle h1 = MethodHandles.iteratedLoop(EmptyIterator.iteratorHandle, EmptyIterator.initIList, EmptyIterator.bodyIString);
        System.out.println(h1.type());
    }

    /**
     * Class contains set of methods for generating empty iterating loop.
     */
    private static class EmptyIterator {
        static int bodyIString(String e) {
            return 0;
        }

        static int initIList(List<String> s) {
            return 0;
        }

        static Iterator<String> iterator() {
            return new ArrayList<String>().iterator();
        }

        private static MethodHandle bodyIString;

        private static MethodHandle iteratorHandle;

        private static MethodHandle initIList;

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