package io.gitlab.jfronny.muscript.ast.dynamic; import io.gitlab.jfronny.muscript.ast.DynamicExpr; import io.gitlab.jfronny.muscript.compiler.*; import io.gitlab.jfronny.muscript.data.Scope; import io.gitlab.jfronny.muscript.data.dynamic.additional.DFinal; import io.gitlab.jfronny.muscript.data.dynamic.Dynamic; import java.io.IOException; import java.util.LinkedList; import java.util.List; public class Bind extends DynamicExpr { public final DynamicExpr callable; public final DynamicExpr parameter; public Bind(int chStart, int chEnd, DynamicExpr callable, DynamicExpr parameter) { super(Order.Call, chStart, chEnd); this.callable = callable; this.parameter = parameter; } @Override public Dynamic get(Scope dataRoot) { return DFinal.of(args -> { List> argsWithParameter = new LinkedList<>(args.getValue()); argsWithParameter.add(0, parameter.get(dataRoot)); return callable.get(dataRoot) .asCallable() .getValue() .apply(DFinal.of(argsWithParameter)); }, this::toString); } @Override public void decompile(ExprWriter writer) throws IOException { parenthesize(parameter, writer, false); writer.append("::"); if (callable instanceof Variable) { callable.decompile(writer); } else { writer.append('('); callable.decompile(writer); writer.append(')'); } } @Override public DynamicExpr optimize() { return new Bind(chStart, chEnd, callable.optimize(), parameter.optimize()); } }