module orelang.operator.RemoveOperator;
import orelang.expression.ImmediateValue,
       orelang.expression.IExpression,
       orelang.operator.IOperator,
       orelang.Closure,
       orelang.Engine,
       orelang.Value;
import std.algorithm,
       std.array;

class RemoveOperator : IOperator {
  /**
   * call
   */
  public Value call(Engine engine, Value[] args) {
    Value efunc = engine.eval(args[0]);
    Value[] eargs1 = engine.eval(args[1]).getArray;
    Value[] ret;

    foreach (elem; eargs1) {
      bool cnd;

      if (efunc.type == ValueType.Closure) {
        cnd = efunc.getClosure.eval([elem]).getBool;
      } else {
        cnd = efunc.getIOperator.call(engine, [elem]).getBool;
      }

      if (!cnd) {
        ret ~= elem;
      }
    }

    return new Value(ret);
  }
}