package water.rapids.ast.prims.operators; import water.rapids.Env; import water.rapids.Val; import water.rapids.ast.AstRoot; /** * Logical-AND. If the first arg is false, do not execute the 2nd arg. */ public class AstLAnd extends AstBinOp { public String str() { return "&&"; } @Override public Val apply(Env env, Env.StackHelp stk, AstRoot asts[]) { Val left = stk.track(asts[1].exec(env)); // If the left is zero, just return the left if (left.isNum()) { double d = left.getNum(); if (d == 0) return left; } Val rite = stk.track(asts[2].exec(env)); return prim_apply(left, rite); } // 0 trumps NA, and NA trumps 1 public double op(double l, double r) { return and_op(l, r); } public static double and_op(double l, double r) { return (l == 0 || r == 0) ? 0 : (Double.isNaN(l) || Double.isNaN(r) ? Double.NaN : 1); } }