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 { 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> b) { return new FObject(Map.copyOf(b)); } public static DList of(Dynamic... b) { return new FList(List.of(b)); } public static DList of(List> b) { return new FList(ImmCollection.of(b)); } public static DCallable of(Function> b, Supplier 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> value) implements DObject { @Override public Map> getValue() { return value; } @Override public String toString() { return Dynamic.serialize(this); } } private record FList(List> value) implements DList { @Override public List> getValue() { return value; } @Override public String toString() { return value.toString(); } } private record FCallable(Function> value, Supplier string) implements DCallable { @Override public void serialize(ExprWriter writer) throws IOException { writer.append(toString()); } @Override public Function> getValue() { return value; } @Override public String toString() { return string.get(); } } }