module orelang.operator.SetIdxOperator;
import orelang.expression.ImmediateValue,
       orelang.operator.IOperator,
       orelang.Engine,
       orelang.Value;
import std.conv;

class SetIdxOperator : IOperator {
  /**
   * call
   */
  public Value call(Engine engine, Value[] args) {
    Value[] arr;
    if (args[0].type == ValueType.ImmediateValue) {
      arr = args[0].getImmediateValue.value.getArray;
    } else {
      arr = engine.eval(args[0]).getArray;
    }
    long  idx   = args[1].getNumeric.to!long;
    Value value = args[2];

    if (0 < idx && idx < arr.length) {
      arr[idx] = value;

      return new Value(new ImmediateValue(new Value(arr)));
    } else {
      throw new Error("Invalid");
    }
  }
}