feat(muscript): use dynamic lenses to support subsequent representation changes using original algorithms

This commit is contained in:
Johannes Frohnmeyer 2023-08-15 13:29:18 +02:00
parent fd7efac605
commit 2ae6900447
Signed by: Johannes
GPG Key ID: E76429612C2929F4
11 changed files with 274 additions and 9 deletions

View File

@ -4,6 +4,7 @@ import io.gitlab.jfronny.muscript.ast.DynamicExpr;
import io.gitlab.jfronny.muscript.ast.dynamic.*;
import io.gitlab.jfronny.muscript.compiler.CodeLocation;
import io.gitlab.jfronny.muscript.data.dynamic.*;
import io.gitlab.jfronny.muscript.data.dynamic.lens.DCallableLens;
import java.util.List;
import java.util.Map;
@ -21,7 +22,7 @@ public record DCallableObject(Map<String, ? extends Dynamic> value, DCallable ca
@Override
public DCallable asCallable() {
return callable;
return new DCallableLens(this, callable::getValue);
}
@Override

View File

@ -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.ExprWriter;
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.time.LocalDate;
@ -31,7 +33,7 @@ public record DDate(Supplier<LocalDate> date) implements DObject {
@Override
public DString asString() {
return DFinal.of(toString());
return new DStringLens(this, this::toString);
}
@Override
@ -41,7 +43,7 @@ public record DDate(Supplier<LocalDate> date) implements DObject {
@Override
public DNumber asNumber() {
return DFinal.of(date.get().toEpochDay());
return new DNumberLens(this, () -> date.get().toEpochDay());
}
@Override

View File

@ -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.compiler.CodeLocation;
import io.gitlab.jfronny.muscript.data.dynamic.*;
import io.gitlab.jfronny.muscript.data.dynamic.lens.*;
import org.jetbrains.annotations.Nullable;
import java.util.*;
@ -44,7 +45,7 @@ public record DEnum(Map<String, ? extends Dynamic> values, @Nullable DEnumEntry
@Override
public DList asList() {
return DFinal.of(List.copyOf(values.values()));
return new DListLens(this, () -> List.copyOf(values.values()));
}
@Override
@ -54,7 +55,7 @@ public record DEnum(Map<String, ? extends Dynamic> values, @Nullable DEnumEntry
@Override
public DString asString() {
return value != null ? value : DFinal.of(StringFormatter.toString(values));
return value != null ? value : new DStringLens(this, () -> StringFormatter.toString(values));
}
@Override
@ -98,7 +99,7 @@ public record DEnum(Map<String, ? extends Dynamic> values, @Nullable DEnumEntry
@Override
public DNumber asNumber() {
return DFinal.of(index);
return new DNumberLens(this, this::index);
}
@Override
@ -108,7 +109,7 @@ public record DEnum(Map<String, ? extends Dynamic> values, @Nullable DEnumEntry
@Override
public DBool asBool() {
return DFinal.of(selected);
return new DBoolLens(this, this::selected);
}
}
}

View File

@ -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.ExprWriter;
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.time.LocalTime;
@ -31,7 +33,7 @@ public record DTime(Supplier<LocalTime> time) implements DObject {
@Override
public DString asString() {
return DFinal.of(toString());
return new DStringLens(this, this::toString);
}
@Override
@ -41,7 +43,7 @@ public record DTime(Supplier<LocalTime> time) implements DObject {
@Override
public DNumber asNumber() {
return DFinal.of(time.get().toSecondOfDay());
return new DNumberLens(this, () -> time.get().toSecondOfDay());
}
@Override

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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();
}
}