41 lines
1.4 KiB
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();
|
|
}
|