package jscl.math.operator.vector;
import jscl.math.Generic;
import jscl.math.JsclInteger;
import jscl.math.JsclVector;
import jscl.math.Variable;
import jscl.math.operator.Operator;
import jscl.math.operator.VectorOperator;
import jscl.math.operator.product.GeometricProduct;
import jscl.mathml.MathML;
import javax.annotation.Nonnull;
public class Del extends VectorOperator {
public static final String NAME = "del";
public Del(Generic vector, Generic variable, Generic algebra) {
super(NAME, new Generic[]{vector, variable, algebra});
}
private Del(@Nonnull Generic parameters[]) {
super(NAME, createParameters(parameters));
}
private static Generic[] createParameters(@Nonnull Generic[] parameters) {
final Generic[] result = new Generic[3];
result[0] = parameters[0];
result[1] = parameters[1];
result[2] = parameters.length > 2 ? parameters[2] : JsclInteger.valueOf(0);
return result;
}
@Override
public int getMinParameters() {
return 2;
}
public Generic selfExpand() {
Variable variable[] = toVariables((JsclVector) parameters[1]);
int algebra[] = GeometricProduct.algebra(parameters[2]);
if (parameters[0] instanceof JsclVector) {
JsclVector vector = (JsclVector) parameters[0];
return vector.del(variable, algebra);
}
return expressionValue();
}
// todo serso: think
/*public String toString() {
final StringBuilder result = new StringBuilder();
int n = 3;
if (parameters[2].signum() == 0) n = 2;
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();
}*/
@Nonnull
@Override
public Operator newInstance(@Nonnull Generic[] parameters) {
return new Del(parameters);
}
protected void bodyToMathML(MathML element) {
operator(element, "nabla");
parameters[0].toMathML(element, null);
}
@Nonnull
public Variable newInstance() {
return new Del(null, null, null);
}
}