module orelang.operator.LoadOperator;
import orelang.operator.IOperator,
       orelang.Interpreter,
       orelang.Transpiler,
       orelang.Engine,
       orelang.Value;
import std.algorithm,
       std.array,
       std.file;

class LoadOperator : IOperator {
  /**
   * call
   */
  public Value call(Engine engine, Value[] args) {
    string[] loaded;
    Value eargs0 = engine.eval(args[0]);
    Interpreter itpr = new Interpreter(engine);

    if (eargs0.type == ValueType.Array) {
      args = eargs0.getArray;
    }

    string[] fpaths = args.map!(arg => (engine.eval(arg)).getString ~ ".ore").array;

    foreach (fpath; fpaths) {
      if (!exists(fpath)) {
        throw new Error("No such file - " ~ fpath);
      } else {
        itpr.executer(readText(fpath));
        loaded ~= fpath;
      }
    }

    Value[] ret;

    foreach (load; loaded) {
      ret ~= new Value(load);
    }

    return new Value(ret);
  }
}