package water.util.fp; /** * Stores stock pure functions, that is those that don't keep any context. * Pure functions have this feature that their equals() only compares classes. */ public class PureFunctions extends Functions { public static final Function<Double, Double> SQUARE = new Function<Double, Double>() { @Override public Double apply(Double x) { return x*x; } }; public static final Function2<Double, Double, Double> PLUS = new Function2<Double, Double, Double>() { @Override public Double apply(Double x, Double y) { return x+y; } }; public static final Function2<Double, Double, Double> PROD = new Function2<Double, Double, Double>() { @Override public Double apply(Double x, Double y) { return x*y; } }; public static final Function2<Double, Double, Double> X2_PLUS_Y2 = new Function2<Double, Double, Double>() { @Override public Double apply(Double x, Double y) { return x*x + y*y; } }; public static final Function3<Double, Double, Double, Double> X2_PLUS_Y2_PLUS_Z2 = new Function3<Double, Double, Double, Double>() { @Override public Double apply(Double x, Double y, Double z) { return x*x + y*y + z*z; } }; public static final Foldable<Double, Double> SUM = new Foldable<Double, Double>() { @Override public Double initial() { return 0.; } @Override public Double apply(Double sum, Double x) { return sum == null || x == null ? null : sum+x; } }; public static final Foldable<Double, Double> SUM_OF_SQUARES = new Foldable<Double, Double>() { @Override public Double initial() { return 0.; } @Override public Double apply(Double sum, Double x) { return sum == null || x == null ? null : sum+x*x; } }; public static final Foldable<Double, Double> PRODUCT = new Foldable<Double, Double>() { @Override public Double initial() { return 1.; } @Override public Double apply(Double sum, Double x) { return sum == null || x == null ? null : sum*x; } }; public static <X,Y,Z> Function<X, Z> compose(final Function<X,Y> f, final Function<Y, Z> g) { return new Function<X, Z>() { @Override public Z apply(X x) { return g.apply(f.apply(x)); } }; } abstract static class Function<X,Y> extends JustCode implements water.util.fp.Function<X, Y> {} abstract static class Function2<X,Y,Z> extends JustCode implements water.util.fp.Function2<X, Y, Z> {} abstract static class Function3<X,Y,Z,T> extends JustCode implements water.util.fp.Function3<X, Y, Z, T> {} abstract static class Foldable<X, Y> extends JustCode implements water.util.fp.Foldable<X, Y> { } abstract static class Unfoldable<X, Y> extends JustCode implements water.util.fp.Unfoldable<X, Y> { } }