package org.matheclipse.core.eval.util;
import org.matheclipse.core.eval.exception.WrongArgumentType;
import org.matheclipse.core.interfaces.IAST;
import org.matheclipse.core.interfaces.IExpr;
import org.matheclipse.core.interfaces.IInteger;
public class Sequence extends ListSizeSequence {
public Sequence(final IInteger i) {
super(i.toInt(), Integer.MIN_VALUE, 1, 1);
}
public Sequence(final IAST lst) {
super(getASTFrom(lst), getASTTo(lst), getASTStep(lst), 1);
}
/**
* Factory method for creating a Sequence from a given expression
*
* @param expr
* an expression, which should represent a sequence specification
* @return returns null if the given expression is no sequence
* specification
*/
public static Sequence createSequence(final IExpr expr) {
Sequence sequ = null;
if (expr.isList()) {
sequ = new Sequence((IAST) expr);
} else if (expr instanceof IInteger) {
sequ = new Sequence((IInteger) expr);
}
return sequ;
}
public static Sequence[] createSequences(final IAST ast, final int offset) {
final Sequence[] sequArray = new Sequence[ast.size() - offset];
Sequence sequ = null;
int j = 0;
for (int i = offset; i < ast.size(); i++) {
if (ast.get(i).isList()) {
sequ = new Sequence((IAST) ast.get(i));
} else if (ast.get(i) instanceof IInteger) {
sequ = new Sequence((IInteger) ast.get(i));
}
sequArray[j++] = sequ;
}
return sequArray;
}
private static int getASTFrom(final IAST lst) {
if ((lst.size() > 1) && !(lst.get(1) instanceof IInteger)) {
throw new WrongArgumentType(lst, lst.get(1), 1);
}
if (lst.size() > 1) {
return ((IInteger) lst.get(1)).toInt();
}
return 0;
}
private static int getASTTo(final IAST lst) {
if ((lst.size() == 2) && (lst.get(1) instanceof IInteger)) {
return ((IInteger) lst.get(1)).toInt();
}
if ((lst.size() > 2) && !(lst.get(2) instanceof IInteger)) {
throw new WrongArgumentType(lst, lst.get(2), 2);
}
if (lst.size() > 2) {
return ((IInteger) lst.get(2)).toInt();
}
return Integer.MIN_VALUE;
}
private static int getASTStep(final IAST lst) {
if ((lst.size() > 3) && !(lst.get(3) instanceof IInteger)) {
throw new WrongArgumentType(lst, lst.get(3), 3);
}
if (lst.size() > 3) {
return ((IInteger) lst.get(3)).toInt();
}
return 1;
}
}
Ads help maintain this website.