package jscl.math.operator; import jscl.math.Generic; import jscl.math.JsclInteger; import jscl.math.Variable; import jscl.math.function.Constants; import jscl.mathml.MathML; import javax.annotation.Nonnull; public class Limit extends Operator { public static final String NAME = "lim"; public Limit(Generic expression, Generic variable, Generic limit, Generic direction) { super(NAME, new Generic[]{expression, variable, limit, direction}); } private Limit(Generic parameters[]) { super(NAME, createParameters(parameters)); } private static Generic[] createParameters(Generic[] parameters) { final Generic[] result = new Generic[4]; result[0] = parameters[0]; result[1] = parameters[1]; result[2] = parameters[2]; result[3] = parameters.length > 3 && (parameters[2].compareTo(Constants.Generic.INF) != 0 && parameters[2].compareTo(Constants.Generic.INF.negate()) != 0) ? JsclInteger.valueOf(parameters[3].signum()) : JsclInteger.valueOf(0); return result; } @Override public int getMinParameters() { return 3; } @Override public int getMaxParameters() { return 4; } public Generic selfExpand() { return expressionValue(); } // todo serso: think /*public String toString() { StringBuilder result = new StringBuilder(); int n=4; if(parameters[3].signum()==0) n=3; result.append(name); result.append("("); for(int i=0;i<n;i++) { result.append(parameters[i]).append(i<n-1?", ":""); } result.append(")"); return result.toString(); }*/ public void toMathML(MathML element, Object data) { int exponent = data instanceof Integer ? (Integer) data : 1; if (exponent == 1) bodyToMathML(element); else { MathML e1 = element.element("msup"); MathML e2 = element.element("mfenced"); bodyToMathML(e2); e1.appendChild(e2); e2 = element.element("mn"); e2.appendChild(element.text(String.valueOf(exponent))); e1.appendChild(e2); element.appendChild(e1); } } @Nonnull @Override public Operator newInstance(@Nonnull Generic[] parameters) { return new Limit(parameters); } void bodyToMathML(MathML element) { int c = parameters[3].signum(); MathML e1 = element.element("mrow"); MathML e2 = element.element("munder"); MathML e3 = element.element("mo"); e3.appendChild(element.text("lim")); e2.appendChild(e3); e3 = element.element("mrow"); parameters[1].toMathML(e3, null); MathML e4 = element.element("mo"); e4.appendChild(element.text("\u2192")); e3.appendChild(e4); if (c == 0) parameters[2].toMathML(e3, null); else { e4 = element.element("msup"); parameters[2].toMathML(e4, null); MathML e5 = element.element("mo"); if (c < 0) e5.appendChild(element.text("-")); else if (c > 0) e5.appendChild(element.text("+")); e4.appendChild(e5); e3.appendChild(e4); } e2.appendChild(e3); e1.appendChild(e2); parameters[0].toMathML(e1, null); element.appendChild(e1); } @Nonnull public Variable newInstance() { return new Limit(null, null, null, null); } }