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

121 lines
3.0 KiB
Java

package io.gitlab.jfronny.muscript.data.dynamic.additional;
import io.gitlab.jfronny.commons.LazySupplier;
import io.gitlab.jfronny.commons.StringFormatter;
import io.gitlab.jfronny.commons.data.ImmCollection;
import io.gitlab.jfronny.muscript.compiler.ExprWriter;
import io.gitlab.jfronny.muscript.data.dynamic.*;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.function.Supplier;
public class DFinal<T> {
public static DBool of(boolean b) {
return new FBool(b);
}
public static DNumber of(double b) {
return new FNumber(b);
}
public static DString of(String b) {
return new FString(b);
}
public static DObject of(Map<String, Dynamic<?>> b) {
return new FObject(Map.copyOf(b));
}
public static DList of(Dynamic<?>... b) {
return new FList(List.of(b));
}
public static DList of(List<Dynamic<?>> b) {
return new FList(ImmCollection.of(b));
}
public static DCallable of(Function<DList, Dynamic<?>> b, Supplier<String> serialized) {
return new FCallable(b, new LazySupplier<>(serialized));
}
private record FBool(boolean value) implements DBool {
@Override
public Boolean getValue() {
return value;
}
@Override
public String toString() {
return StringFormatter.toString(value);
}
}
private record FNumber(double value) implements DNumber {
@Override
public Double getValue() {
return value;
}
@Override
public String toString() {
return StringFormatter.toString(value);
}
}
private record FString(String value) implements DString {
@Override
public String getValue() {
return value;
}
@Override
public String toString() {
return Dynamic.serialize(this);
}
}
private record FObject(Map<String, Dynamic<?>> value) implements DObject {
@Override
public Map<String, Dynamic<?>> getValue() {
return value;
}
@Override
public String toString() {
return Dynamic.serialize(this);
}
}
private record FList(List<Dynamic<?>> value) implements DList {
@Override
public List<Dynamic<?>> getValue() {
return value;
}
@Override
public String toString() {
return value.toString();
}
}
private record FCallable(Function<DList, Dynamic<?>> value, Supplier<String> string) implements DCallable {
@Override
public void serialize(ExprWriter writer) throws IOException {
writer.append(toString());
}
@Override
public Function<DList, Dynamic<?>> getValue() {
return value;
}
@Override
public String toString() {
return string.get();
}
}
}