package jscl.math.operator; import jscl.math.*; import jscl.math.numeric.Real; import javax.annotation.Nonnull; public class Modulo extends Operator { public static final String NAME = "mod"; public Modulo(Generic first, Generic second) { super(NAME, new Generic[]{first, second}); } private Modulo(Generic parameters[]) { super(NAME, parameters); } @Override public int getMinParameters() { return 2; } public Generic selfExpand() { try { return tryIntegerMod(); } catch (NotIntegerException e) { } return tryRealMod(); } private Generic tryRealMod() { final double numerator = parameters[0].doubleValue(); final double denominator = parameters[1].doubleValue(); return new NumericWrapper(Real.valueOf(numerator % denominator)); } @Nonnull private Generic tryIntegerMod() throws NotIntegerException{ final JsclInteger numerator = parameters[0].integerValue(); final JsclInteger denominator = parameters[1].integerValue(); return numerator.mod(denominator); } @Nonnull @Override public Operator newInstance(@Nonnull Generic[] parameters) { return new Modulo(parameters); } @Override public Generic numeric() { return newNumericFunction().selfNumeric(); } @Override public Generic selfNumeric() { return selfExpand(); } @Nonnull public Variable newInstance() { return new Modulo(null, null); } }