diff --git a/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/additional/DCallableObject.java b/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/additional/DCallableObject.java index ef8c6ec..6f21736 100644 --- a/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/additional/DCallableObject.java +++ b/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/additional/DCallableObject.java @@ -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 value, DCallable ca @Override public DCallable asCallable() { - return callable; + return new DCallableLens(this, callable::getValue); } @Override diff --git a/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/additional/DDate.java b/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/additional/DDate.java index 3cb1485..38fe1bd 100644 --- a/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/additional/DDate.java +++ b/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/additional/DDate.java @@ -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 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 date) implements DObject { @Override public DNumber asNumber() { - return DFinal.of(date.get().toEpochDay()); + return new DNumberLens(this, () -> date.get().toEpochDay()); } @Override diff --git a/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/additional/DEnum.java b/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/additional/DEnum.java index ebdae52..2b62958 100644 --- a/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/additional/DEnum.java +++ b/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/additional/DEnum.java @@ -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 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 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 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 values, @Nullable DEnumEntry @Override public DBool asBool() { - return DFinal.of(selected); + return new DBoolLens(this, this::selected); } } } diff --git a/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/additional/DTime.java b/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/additional/DTime.java index 38ed0e6..5ebb42e 100644 --- a/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/additional/DTime.java +++ b/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/additional/DTime.java @@ -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 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 time) implements DObject { @Override public DNumber asNumber() { - return DFinal.of(time.get().toSecondOfDay()); + return new DNumberLens(this, () -> time.get().toSecondOfDay()); } @Override diff --git a/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/lens/DBoolLens.java b/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/lens/DBoolLens.java new file mode 100644 index 0000000..f2ac818 --- /dev/null +++ b/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/lens/DBoolLens.java @@ -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(); + } +} diff --git a/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/lens/DCallableLens.java b/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/lens/DCallableLens.java new file mode 100644 index 0000000..d5f31f2 --- /dev/null +++ b/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/lens/DCallableLens.java @@ -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> value; + + public DCallableLens(Dynamic source, Supplier> value) { + super(source); + this.value = Objects.requireNonNull(value); + } + + @Override + public Function getValue() { + return value.get(); + } + + @Override + public Expr toExpr() { + return source.toExpr(); + } +} diff --git a/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/lens/DLens.java b/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/lens/DLens.java new file mode 100644 index 0000000..0e6bb10 --- /dev/null +++ b/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/lens/DLens.java @@ -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(); + } +} diff --git a/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/lens/DListLens.java b/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/lens/DListLens.java new file mode 100644 index 0000000..bd4db97 --- /dev/null +++ b/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/lens/DListLens.java @@ -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> value; + + public DListLens(Dynamic source, Supplier> value) { + super(source); + this.value = Objects.requireNonNull(value); + } + + @Override + public List getValue() { + return value.get(); + } + + @Override + public DynamicExpr toExpr() { + return source.toExpr().asDynamicExpr(); + } +} diff --git a/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/lens/DNumberLens.java b/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/lens/DNumberLens.java new file mode 100644 index 0000000..fa941a4 --- /dev/null +++ b/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/lens/DNumberLens.java @@ -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(); + } +} diff --git a/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/lens/DObjectLens.java b/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/lens/DObjectLens.java new file mode 100644 index 0000000..02c8b72 --- /dev/null +++ b/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/lens/DObjectLens.java @@ -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> value; + + public DObjectLens(Dynamic source, Supplier> value) { + super(source); + this.value = Objects.requireNonNull(value); + } + + @Override + public Map getValue() { + return value.get(); + } + + @Override + public DynamicExpr toExpr() { + return source.toExpr().asDynamicExpr(); + } +} diff --git a/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/lens/DStringLens.java b/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/lens/DStringLens.java new file mode 100644 index 0000000..7f5a9e4 --- /dev/null +++ b/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/lens/DStringLens.java @@ -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 value; + + public DStringLens(Dynamic source, Supplier value) { + super(source); + this.value = Objects.requireNonNull(value); + } + + @Override + public String getValue() { + return value.get(); + } + + @Override + public StringExpr toExpr() { + return source.toExpr().asStringExpr(); + } +}