java-commons/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/DCallable.java

41 lines
1.4 KiB
Java

package io.gitlab.jfronny.muscript.data.dynamic;
import io.gitlab.jfronny.muscript.data.dynamic.additional.DFinal;
import io.gitlab.jfronny.muscript.data.dynamic.additional.NamedDCallable;
import io.gitlab.jfronny.muscript.data.dynamic.type.*;
import java.util.List;
import java.util.function.Function;
public non-sealed interface DCallable extends Dynamic {
String DEFAULT_NAME = "<unnamed>";
default Dynamic call(DList args) {
DType signature = getSignature();
if (signature != null) {
List<DType> argTypes = args.getValue().stream().map(Dynamic::getSignature).toList();
if (!TypeMatcher.match(signature, argTypes)) {
List<DTypeCallable.Arg> extraArgs = argTypes.stream().map(s -> new DTypeCallable.Arg(null, s, false)).toList();
DTypeCallable callSignature = new DTypeCallable(extraArgs, null);
throw new IllegalArgumentException("Signature mismatch for " + getName() + ": expected <" + signature + "> but got <" + callSignature + ">");
}
}
return getValue().apply(args);
}
default Dynamic call(Dynamic... args) {
return call(DFinal.of(args));
}
default String getName() {
return DEFAULT_NAME;
}
default DCallable named(String name) {
return new NamedDCallable(this, name);
}
@Override
Function<DList, Dynamic> getValue();
}