package net.varkhan.data.learn.distance; import net.varkhan.base.functor.Functional; import net.varkhan.base.functor._; import net.varkhan.base.functor.curry.Pair; /** * <b></b>. * <p/> * * @author varkhan * @date 12/1/13 * @time 5:56 PM */ public abstract class Distance<T,C> implements Functional<_<T,_<T,_>>,C> { public double invoke(_<T,_<T,_>> arg, C ctx) { return invoke(arg.lvalue(),arg._value().lvalue(),ctx); } public abstract double invoke(T lvalue, T rvalue, C ctx); public static <T,C> Distance<T,C> wrap(final Functional<_<T,_<T,_>>,C> dist) { if(dist instanceof Distance) return (Distance<T, C>) dist; return new Distance<T,C>() { public double invoke(T lvalue, T rvalue, C ctx) { return invoke(new Pair.Value<T,T>(lvalue, rvalue), ctx); } }; } }