feat(muscript): use dynamic lenses to support subsequent representation changes using original algorithms
This commit is contained in:
parent
fd7efac605
commit
2ae6900447
@ -4,6 +4,7 @@ import io.gitlab.jfronny.muscript.ast.DynamicExpr;
|
|||||||
import io.gitlab.jfronny.muscript.ast.dynamic.*;
|
import io.gitlab.jfronny.muscript.ast.dynamic.*;
|
||||||
import io.gitlab.jfronny.muscript.compiler.CodeLocation;
|
import io.gitlab.jfronny.muscript.compiler.CodeLocation;
|
||||||
import io.gitlab.jfronny.muscript.data.dynamic.*;
|
import io.gitlab.jfronny.muscript.data.dynamic.*;
|
||||||
|
import io.gitlab.jfronny.muscript.data.dynamic.lens.DCallableLens;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -21,7 +22,7 @@ public record DCallableObject(Map<String, ? extends Dynamic> value, DCallable ca
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DCallable asCallable() {
|
public DCallable asCallable() {
|
||||||
return callable;
|
return new DCallableLens(this, callable::getValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -7,6 +7,8 @@ import io.gitlab.jfronny.muscript.ast.literal.NumberLiteral;
|
|||||||
import io.gitlab.jfronny.muscript.compiler.CodeLocation;
|
import io.gitlab.jfronny.muscript.compiler.CodeLocation;
|
||||||
import io.gitlab.jfronny.muscript.compiler.ExprWriter;
|
import io.gitlab.jfronny.muscript.compiler.ExprWriter;
|
||||||
import io.gitlab.jfronny.muscript.data.dynamic.*;
|
import io.gitlab.jfronny.muscript.data.dynamic.*;
|
||||||
|
import io.gitlab.jfronny.muscript.data.dynamic.lens.DNumberLens;
|
||||||
|
import io.gitlab.jfronny.muscript.data.dynamic.lens.DStringLens;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
@ -31,7 +33,7 @@ public record DDate(Supplier<LocalDate> date) implements DObject {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DString asString() {
|
public DString asString() {
|
||||||
return DFinal.of(toString());
|
return new DStringLens(this, this::toString);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -41,7 +43,7 @@ public record DDate(Supplier<LocalDate> date) implements DObject {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DNumber asNumber() {
|
public DNumber asNumber() {
|
||||||
return DFinal.of(date.get().toEpochDay());
|
return new DNumberLens(this, () -> date.get().toEpochDay());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -7,6 +7,7 @@ import io.gitlab.jfronny.muscript.ast.dynamic.Variable;
|
|||||||
import io.gitlab.jfronny.muscript.ast.literal.StringLiteral;
|
import io.gitlab.jfronny.muscript.ast.literal.StringLiteral;
|
||||||
import io.gitlab.jfronny.muscript.compiler.CodeLocation;
|
import io.gitlab.jfronny.muscript.compiler.CodeLocation;
|
||||||
import io.gitlab.jfronny.muscript.data.dynamic.*;
|
import io.gitlab.jfronny.muscript.data.dynamic.*;
|
||||||
|
import io.gitlab.jfronny.muscript.data.dynamic.lens.*;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
@ -44,7 +45,7 @@ public record DEnum(Map<String, ? extends Dynamic> values, @Nullable DEnumEntry
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DList asList() {
|
public DList asList() {
|
||||||
return DFinal.of(List.copyOf(values.values()));
|
return new DListLens(this, () -> List.copyOf(values.values()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -54,7 +55,7 @@ public record DEnum(Map<String, ? extends Dynamic> values, @Nullable DEnumEntry
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DString asString() {
|
public DString asString() {
|
||||||
return value != null ? value : DFinal.of(StringFormatter.toString(values));
|
return value != null ? value : new DStringLens(this, () -> StringFormatter.toString(values));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -98,7 +99,7 @@ public record DEnum(Map<String, ? extends Dynamic> values, @Nullable DEnumEntry
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DNumber asNumber() {
|
public DNumber asNumber() {
|
||||||
return DFinal.of(index);
|
return new DNumberLens(this, this::index);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -108,7 +109,7 @@ public record DEnum(Map<String, ? extends Dynamic> values, @Nullable DEnumEntry
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DBool asBool() {
|
public DBool asBool() {
|
||||||
return DFinal.of(selected);
|
return new DBoolLens(this, this::selected);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,8 @@ import io.gitlab.jfronny.muscript.ast.literal.NumberLiteral;
|
|||||||
import io.gitlab.jfronny.muscript.compiler.CodeLocation;
|
import io.gitlab.jfronny.muscript.compiler.CodeLocation;
|
||||||
import io.gitlab.jfronny.muscript.compiler.ExprWriter;
|
import io.gitlab.jfronny.muscript.compiler.ExprWriter;
|
||||||
import io.gitlab.jfronny.muscript.data.dynamic.*;
|
import io.gitlab.jfronny.muscript.data.dynamic.*;
|
||||||
|
import io.gitlab.jfronny.muscript.data.dynamic.lens.DNumberLens;
|
||||||
|
import io.gitlab.jfronny.muscript.data.dynamic.lens.DStringLens;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.time.LocalTime;
|
import java.time.LocalTime;
|
||||||
@ -31,7 +33,7 @@ public record DTime(Supplier<LocalTime> time) implements DObject {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DString asString() {
|
public DString asString() {
|
||||||
return DFinal.of(toString());
|
return new DStringLens(this, this::toString);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -41,7 +43,7 @@ public record DTime(Supplier<LocalTime> time) implements DObject {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DNumber asNumber() {
|
public DNumber asNumber() {
|
||||||
return DFinal.of(time.get().toSecondOfDay());
|
return new DNumberLens(this, () -> time.get().toSecondOfDay());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -0,0 +1,27 @@
|
|||||||
|
package io.gitlab.jfronny.muscript.data.dynamic.lens;
|
||||||
|
|
||||||
|
import io.gitlab.jfronny.muscript.ast.BoolExpr;
|
||||||
|
import io.gitlab.jfronny.muscript.data.dynamic.DBool;
|
||||||
|
import io.gitlab.jfronny.muscript.data.dynamic.Dynamic;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.function.BooleanSupplier;
|
||||||
|
|
||||||
|
public final class DBoolLens extends DLens implements DBool {
|
||||||
|
private final BooleanSupplier value;
|
||||||
|
|
||||||
|
public DBoolLens(Dynamic source, BooleanSupplier value) {
|
||||||
|
super(source);
|
||||||
|
this.value = Objects.requireNonNull(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean getValue() {
|
||||||
|
return value.getAsBoolean();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BoolExpr toExpr() {
|
||||||
|
return source.toExpr().asBoolExpr();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
package io.gitlab.jfronny.muscript.data.dynamic.lens;
|
||||||
|
|
||||||
|
import io.gitlab.jfronny.muscript.ast.Expr;
|
||||||
|
import io.gitlab.jfronny.muscript.data.dynamic.*;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
public final class DCallableLens extends DLens implements DCallable {
|
||||||
|
private final Supplier<Function<DList, Dynamic>> value;
|
||||||
|
|
||||||
|
public DCallableLens(Dynamic source, Supplier<Function<DList, Dynamic>> value) {
|
||||||
|
super(source);
|
||||||
|
this.value = Objects.requireNonNull(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Function<DList, Dynamic> getValue() {
|
||||||
|
return value.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Expr<?> toExpr() {
|
||||||
|
return source.toExpr();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,95 @@
|
|||||||
|
package io.gitlab.jfronny.muscript.data.dynamic.lens;
|
||||||
|
|
||||||
|
import io.gitlab.jfronny.muscript.compiler.ExprWriter;
|
||||||
|
import io.gitlab.jfronny.muscript.data.dynamic.*;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public abstract sealed class DLens implements DynamicBase permits DBoolLens, DCallableLens, DListLens, DNumberLens, DObjectLens, DStringLens {
|
||||||
|
protected final Dynamic source;
|
||||||
|
|
||||||
|
protected DLens(Dynamic source) {
|
||||||
|
this.source = Objects.requireNonNull(source);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void serialize(ExprWriter writer) throws IOException {
|
||||||
|
source.serialize(writer);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isBool() {
|
||||||
|
return source.isBool();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DBool asBool() {
|
||||||
|
return source.asBool();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNumber() {
|
||||||
|
return source.isNumber();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DNumber asNumber() {
|
||||||
|
return source.asNumber();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isString() {
|
||||||
|
return source.isString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DString asString() {
|
||||||
|
return source.asString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isObject() {
|
||||||
|
return source.isObject();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DObject asObject() {
|
||||||
|
return source.asObject();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isList() {
|
||||||
|
return source.isList();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DList asList() {
|
||||||
|
return source.asList();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isCallable() {
|
||||||
|
return source.isCallable();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DCallable asCallable() {
|
||||||
|
return source.asCallable();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return source.hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
return obj instanceof DLens lens ? source.equals(lens.source) : source.equals(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return source.toString();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
package io.gitlab.jfronny.muscript.data.dynamic.lens;
|
||||||
|
|
||||||
|
import io.gitlab.jfronny.muscript.ast.DynamicExpr;
|
||||||
|
import io.gitlab.jfronny.muscript.data.dynamic.DList;
|
||||||
|
import io.gitlab.jfronny.muscript.data.dynamic.Dynamic;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
public final class DListLens extends DLens implements DList {
|
||||||
|
private final Supplier<List<? extends Dynamic>> value;
|
||||||
|
|
||||||
|
public DListLens(Dynamic source, Supplier<List<? extends Dynamic>> value) {
|
||||||
|
super(source);
|
||||||
|
this.value = Objects.requireNonNull(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<? extends Dynamic> getValue() {
|
||||||
|
return value.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DynamicExpr toExpr() {
|
||||||
|
return source.toExpr().asDynamicExpr();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
package io.gitlab.jfronny.muscript.data.dynamic.lens;
|
||||||
|
|
||||||
|
import io.gitlab.jfronny.muscript.ast.NumberExpr;
|
||||||
|
import io.gitlab.jfronny.muscript.data.dynamic.DNumber;
|
||||||
|
import io.gitlab.jfronny.muscript.data.dynamic.Dynamic;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.function.DoubleSupplier;
|
||||||
|
|
||||||
|
public final class DNumberLens extends DLens implements DNumber {
|
||||||
|
private final DoubleSupplier value;
|
||||||
|
|
||||||
|
public DNumberLens(Dynamic source, DoubleSupplier value) {
|
||||||
|
super(source);
|
||||||
|
this.value = Objects.requireNonNull(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Double getValue() {
|
||||||
|
return value.getAsDouble();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NumberExpr toExpr() {
|
||||||
|
return source.toExpr().asNumberExpr();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
package io.gitlab.jfronny.muscript.data.dynamic.lens;
|
||||||
|
|
||||||
|
import io.gitlab.jfronny.muscript.ast.DynamicExpr;
|
||||||
|
import io.gitlab.jfronny.muscript.data.dynamic.DObject;
|
||||||
|
import io.gitlab.jfronny.muscript.data.dynamic.Dynamic;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
public final class DObjectLens extends DLens implements DObject {
|
||||||
|
private final Supplier<Map<String, ? extends Dynamic>> value;
|
||||||
|
|
||||||
|
public DObjectLens(Dynamic source, Supplier<Map<String, ? extends Dynamic>> value) {
|
||||||
|
super(source);
|
||||||
|
this.value = Objects.requireNonNull(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<String, ? extends Dynamic> getValue() {
|
||||||
|
return value.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DynamicExpr toExpr() {
|
||||||
|
return source.toExpr().asDynamicExpr();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
package io.gitlab.jfronny.muscript.data.dynamic.lens;
|
||||||
|
|
||||||
|
import io.gitlab.jfronny.muscript.ast.StringExpr;
|
||||||
|
import io.gitlab.jfronny.muscript.data.dynamic.DString;
|
||||||
|
import io.gitlab.jfronny.muscript.data.dynamic.Dynamic;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
public final class DStringLens extends DLens implements DString {
|
||||||
|
private final Supplier<String> value;
|
||||||
|
|
||||||
|
public DStringLens(Dynamic source, Supplier<String> value) {
|
||||||
|
super(source);
|
||||||
|
this.value = Objects.requireNonNull(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getValue() {
|
||||||
|
return value.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StringExpr toExpr() {
|
||||||
|
return source.toExpr().asStringExpr();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user