package net.varkhan.base.functor.functional; import net.varkhan.base.functor.Functional; /** * <b></b>. * <p/> * * @author varkhan * @date 2/11/12 * @time 3:23 PM */ public abstract class TransformFunctional<A,C> implements Functional<A,C> { protected final Functional<A, C> func; public TransformFunctional(Functional<A,C> func) { this.func = func; } public Functional<A, C> component() { return func; } public abstract double invoke(A arg, C ctx); public static <A, C> TransformFunctional<A, C> log(Functional<A,C> func) { return new TransformFunctional<A,C>(func) { public double invoke(A arg, C ctx) { return Math.log(func.invoke(arg, ctx)); } public String toString() { return toString("log"); } }; } public static <A, C> TransformFunctional<A, C> exp(Functional<A,C> func) { return new TransformFunctional<A,C>(func) { public double invoke(A arg, C ctx) { return Math.exp(func.invoke(arg, ctx)); } public String toString() { return toString("exp"); } }; } public static <A, C> TransformFunctional<A, C> sin(Functional<A,C> func) { return new TransformFunctional<A,C>(func) { public double invoke(A arg, C ctx) { return Math.sin(func.invoke(arg, ctx)); } public String toString() { return toString("sin"); } }; } public static <A, C> TransformFunctional<A, C> cos(Functional<A,C> func) { return new TransformFunctional<A,C>(func) { public double invoke(A arg, C ctx) { return Math.cos(func.invoke(arg, ctx)); } public String toString() { return toString("cos"); } }; } public static <A, C> TransformFunctional<A, C> tan(Functional<A,C> func) { return new TransformFunctional<A,C>(func) { public double invoke(A arg, C ctx) { return Math.tan(func.invoke(arg, ctx)); } public String toString() { return toString("tan"); } }; } public static <A, C> TransformFunctional<A, C> abs(Functional<A,C> func) { return new TransformFunctional<A,C>(func) { public double invoke(A arg, C ctx) { return Math.abs(func.invoke(arg, ctx)); } public String toString() { return toString("abs"); } }; } public static <A, C> TransformFunctional<A, C> asin(Functional<A,C> func) { return new TransformFunctional<A,C>(func) { public double invoke(A arg, C ctx) { return Math.asin(func.invoke(arg, ctx)); } public String toString() { return toString("asin"); } }; } public static <A, C> TransformFunctional<A, C> acos(Functional<A,C> func) { return new TransformFunctional<A,C>(func) { public double invoke(A arg, C ctx) { return Math.acos(func.invoke(arg, ctx)); } public String toString() { return toString("acos"); } }; } public static <A, C> TransformFunctional<A, C> atan(Functional<A,C> func) { return new TransformFunctional<A,C>(func) { public double invoke(A arg, C ctx) { return Math.atan(func.invoke(arg, ctx)); } public String toString() { return toString("atan"); } }; } public static <A, C> TransformFunctional<A, C> sinh(Functional<A,C> func) { return new TransformFunctional<A,C>(func) { public double invoke(A arg, C ctx) { return Math.sinh(func.invoke(arg, ctx)); } public String toString() { return toString("sinh"); } }; } public static <A, C> TransformFunctional<A, C> cosh(Functional<A,C> func) { return new TransformFunctional<A,C>(func) { public double invoke(A arg, C ctx) { return Math.cosh(func.invoke(arg, ctx)); } public String toString() { return toString("cosh"); } }; } public static <A, C> TransformFunctional<A, C> tanh(Functional<A,C> func) { return new TransformFunctional<A,C>(func) { public double invoke(A arg, C ctx) { return Math.tanh(func.invoke(arg, ctx)); } public String toString() { return toString("tanh"); } }; } public static <A, C> TransformFunctional<A, C> sqrt(Functional<A,C> func) { return new TransformFunctional<A,C>(func) { public double invoke(A arg, C ctx) { return Math.sqrt(func.invoke(arg, ctx)); } public String toString() { return toString("sqrt"); } }; } protected String toString(String op) { StringBuilder buf = new StringBuilder(op); buf.append('('); buf.append(component().toString()); buf.append(')'); return buf.toString(); } @Override public String toString() { return toString(this.getClass().getSimpleName()); } }