module orelang.operator.SetOperator;
import orelang.expression.ClassType,
       orelang.operator.IOperator,
       orelang.Engine,
       orelang.Value;

class SetOperator : IOperator {
  /**
   * call
   */
  public Value call(Engine engine, Value[] args) {
    return engine.setVariable(args[0].getString, engine.eval(args[1]));
  }
}


/**
 * Set a value to the variable defined in parent scope
 */
class SetPOperator : IOperator {
  /**
   * call
   */
  public Value call(Engine engine, Value[] args) {
    return engine.peekSuper.setVariable(args[0].getString, engine.eval(args[1]));
  }
}


/**
 * Set a value to the variable defined in class value
 */
class SetCOperator : IOperator {
  /**
   * call
   */
  public Value call(Engine engine, Value[] args) {
    ClassType cls  = engine.eval(args[0]).getClassType;
    string varName = args[1].type == ValueType.SymbolValue ? args[1].getString : engine.eval(args[1]).getString;
    Value  value   = engine.eval(args[2]);

    return cls._engine.setVariable(varName, value);
  }
}