package org.enumerable.lambda.support.scala;
import org.enumerable.lambda.Fn0;
import org.enumerable.lambda.Fn1;
import org.enumerable.lambda.Fn2;
import org.enumerable.lambda.Fn3;
import org.enumerable.lambda.annotation.NewLambda;
import org.enumerable.lambda.exception.LambdaWeavingNotEnabledException;
import org.enumerable.lambda.support.scala.FunctionFn0;
import org.enumerable.lambda.support.scala.FunctionFn1;
import org.enumerable.lambda.support.scala.FunctionFn2;
import org.enumerable.lambda.support.scala.FunctionFn3;
import org.enumerable.lambda.support.scala.ScalaLambdaFactory;
import scala.Function0;
import scala.Function1;
import scala.Function2;
import scala.Function3;
@SuppressWarnings("serial")
public class LambdaScala {
@NewLambda
public static <R> FunctionFn0<R> function(R block) {
throw new LambdaWeavingNotEnabledException();
}
@NewLambda
public static <A1, R> FunctionFn1<A1, R> function(A1 a1, R block) {
throw new LambdaWeavingNotEnabledException();
}
@NewLambda
public static <A1, A2, R> FunctionFn2<A1, A2, R> function(A1 a1, A2 a2, R block) {
throw new LambdaWeavingNotEnabledException();
}
@NewLambda
public static <A1, A2, A3, R> FunctionFn3<A1, A2, A3, R> function(A1 a1, A2 a2, A3 a3, R block) {
throw new LambdaWeavingNotEnabledException();
}
public static <R> Function0<R> toFunction(final Fn0<R> block) {
return ScalaLambdaFactory.toFunction(block);
}
public static <A1, R> Function1<A1, R> toFunction(final Fn1<A1, R> block) {
return ScalaLambdaFactory.toFunction(block);
}
public static <A1, A2, R> Function2<A1, A2, R> toFunction(final Fn2<A1, A2, R> block) {
return ScalaLambdaFactory.toFunction(block);
}
public static <A1, A2, A3, R> Function3<A1, A2, A3, R> toFunction(final Fn3<A1, A2, A3, R> block) {
return ScalaLambdaFactory.toFunction(block);
}
public static <R> Fn0<R> toFn0(final Function0<R> f) {
return new Fn0<R>() {
public R call() {
return f.apply();
}
};
}
public static <A1, R> Fn1<A1, R> toFn1(final Function1<A1, R> f) {
return new Fn1<A1, R>() {
public R call(A1 a1) {
return f.apply(a1);
}
};
}
public static <A1, A2, R> Fn2<A1, A2, R> toFn2(final Function2<A1, A2, R> f) {
return new Fn2<A1, A2, R>() {
public R call(A1 a1, A2 a2) {
return f.apply(a1, a2);
}
};
}
public static <A1, A2, A3, R> Fn3<A1, A2, A3, R> toFn3(final Function3<A1, A2, A3, R> f) {
return new Fn3<A1, A2, A3, R>() {
public R call(A1 a1, A2 a2, A3 a3) {
return f.apply(a1, a2, a3);
}
};
}
}