package org.enumerable.lambda.support.methodhandle;
import org.enumerable.lambda.Fn0;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import static org.enumerable.lambda.exception.UncheckedException.uncheck;
/**
* This class converts lambdas created by {@link org.enumerable.lambda.weaving.LambdaLoader} to {@link java.lang.invoke.MethodHandle}
*
* It lives under support instead of being an instance method as it requires Java 7.
*/
public class LambdaMethodHandle {
public static MethodHandle bind(Object fn) {
try {
return MethodHandles.lookup().unreflect(Fn0.getLambdaMethod(fn.getClass())).bindTo(fn);
} catch (Exception e) {
throw uncheck(e);
}
}
public static MethodHandle bind(Fn0<?> fn) {
try {
return MethodHandles.lookup().bind(fn, "call", MethodType.genericMethodType(fn.arity()));
} catch (Exception e) {
throw uncheck(e);
}
}
}