package org.multiverse.api.functions; /** * A utility class for {@link Function} functionality. * * @author Peter Veentjer. */ public final class Functions { private static final IntFunction incOneIntFunction = new IncIntFunction(1); private static final LongFunction incOneLongFunction = new IncLongFunction(1); private static final IntFunction decOneIntFunction = new IncIntFunction(-1); private static final LongFunction decOneLongFunction = new IncLongFunction(-1); private static final DoubleFunction incOneDoubleFunction = new IncDoubleFunction(); private static final DoubleFunction identityDoubleFunction = new IdentityDoubleFunction(); /** * Returns an {@link Function} that returns its input. * * @return the identity function. */ public static Function identityFunction(){ return identityFunction; } /** * Returns an {@link DoubleFunction} that returns its input. * * @return the identity function. */ public static DoubleFunction identityDoubleFunction() { return identityDoubleFunction; } /** * Returns a {@link DoubleFunction} that increments the input with one. * * @return the increment function. */ public static DoubleFunction incDoubleFunction() { return incOneDoubleFunction; } /** * Returns an identity {@link IntFunction} (a function that returns its input value). The instance is cached. * * @return the identity IntFunction. */ public static IntFunction identityIntFunction() { return identityIntFunction; } /** * Returns an identity {@link LongFunction} (a function that returns its input value). The instance is cached. * * @return the identity LongFunction. */ public static LongFunction identityLongFunction() { return identityLongFunction; } /** * Returns an {@link IntFunction} that increments the input value by one. The instance is cached. * * @return the increment IntFunction. */ public static IntFunction incIntFunction() { return incOneIntFunction; } /** * Returns an {@link IntFunction} that decrements the input value by one. The instance is cached. * * @return the decrease IntFunction. */ public static IntFunction decIntFunction() { return decOneIntFunction; } /** * Returns a {@link LongFunction} that increments the input value by one. The instance is cached. * * @return the increment LongFunction. */ public static LongFunction incLongFunction() { return incOneLongFunction; } /** * Returns a {@link LongFunction} that decrements the input value by one. The instance is cached. * * @return the decrement LongFunction. */ public static LongFunction decLongFunction() { return decOneLongFunction; } /** * Returns a {@link IntFunction} that increments with the given amount. For the -1, 0 and 1 * a cached instance is returned. In the other cases a new instance is created. * * @param amount the value to increment with. A negative value does a decrement. * @return the increment IntFunction. */ public static IntFunction incIntFunction(int amount) { switch (amount) { case 0: return identityIntFunction; case 1: return incOneIntFunction; case -1: return decOneIntFunction; default: return new IncIntFunction(amount); } } /** * Returns a {@link BooleanFunction} that inverts the argument. * * @return the function */ public static BooleanFunction inverseBooleanFunction() { return inverseBooleanFunction; } /** * Returns a {@link BooleanFunction} that returns the argument. * * @return the function. */ public static BooleanFunction identityBooleanFunction() { return identityBooleanFunction; } /** * Returns a {@link LongFunction} that increments with the given amount. For the -1, 0 and 1 * a cached instance is returned. In the other cases a new instance is created. * * @param amount the value to increment with. A negative value does a decrement. * @return the increment LongFunction. */ public static LongFunction incLongFunction(long amount) { if (amount == 0) { return identityLongFunction; } if (amount == 1) { return incOneLongFunction; } if (amount == -1) { return decOneLongFunction; } return new IncLongFunction(amount); } private static final BooleanFunction inverseBooleanFunction = new BooleanFunction() { @Override public boolean call(boolean current) { return !current; } }; private static final BooleanFunction identityBooleanFunction = new BooleanFunction() { @Override public boolean call(boolean current) { return current; } @Override public String toString() { return "IdentityBooleanFunction"; } }; private static final IntFunction identityIntFunction = new IntFunction() { @Override public int call(int current) { return current; } @Override public String toString() { return "IdentityIntFunction"; } }; private static final LongFunction identityLongFunction = new LongFunction() { @Override public long call(long current) { return current; } @Override public String toString() { return "IdentityLongFunction"; } }; private static final Function identityFunction = new Function() { @Override public Object call(Object value) { return value; } @Override public String toString() { return "IdentityFunction"; } }; private static class IncIntFunction extends IntFunction { private final int value; public IncIntFunction(int value) { this.value = value; } @Override public int call(int current) { return current + value; } @Override public String toString() { return "IncIntFunction{" + "value=" + value + '}'; } } private static class IncLongFunction extends LongFunction { private final long value; public IncLongFunction(long value) { this.value = value; } @Override public long call(long current) { return current + value; } @Override public String toString() { return "IncLongFunction{" + "value=" + value + '}'; } } private static class IncDoubleFunction extends DoubleFunction { @Override public double call(double current) { return current + 1; } @Override public String toString() { return "IncDoubleFunction{value=1}"; } } private static class IdentityDoubleFunction extends DoubleFunction { @Override public double call(double current) { return current; } @Override public String toString() { return "IdentityDoubleFunction{}"; } } //we don't want instances. private Functions() { } }