From a02e39ea9877dec258cd06e723fa5cae493c9524 Mon Sep 17 00:00:00 2001 From: Master-Bw3 Date: Thu, 16 Nov 2023 14:10:09 -0600 Subject: [PATCH 1/4] Add Operate method to Operator that wraps Apply --- .../arithmetic/engine/ArithmeticEngine.java | 20 ++++-- .../casting/arithmetic/operator/Operator.java | 55 ---------------- .../casting/arithmetic/operator/Operator.kt | 64 +++++++++++++++++++ .../api/casting/castables/OperationAction.kt | 9 +-- 4 files changed, 79 insertions(+), 69 deletions(-) delete mode 100644 Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/Operator.java create mode 100644 Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/Operator.kt diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/engine/ArithmeticEngine.java b/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/engine/ArithmeticEngine.java index 28e2912cee..2f7e1fe7dc 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/engine/ArithmeticEngine.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/engine/ArithmeticEngine.java @@ -3,6 +3,9 @@ import at.petrak.hexcasting.api.casting.arithmetic.Arithmetic; import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator; import at.petrak.hexcasting.api.casting.eval.CastingEnvironment; +import at.petrak.hexcasting.api.casting.eval.OperationResult; +import at.petrak.hexcasting.api.casting.eval.vm.CastingImage; +import at.petrak.hexcasting.api.casting.eval.vm.SpellContinuation; import at.petrak.hexcasting.api.casting.iota.Iota; import at.petrak.hexcasting.api.casting.math.HexPattern; import at.petrak.hexcasting.api.casting.mishaps.Mishap; @@ -64,29 +67,34 @@ public Iterable operatorSyms() { /** * Runs one of the contained Operators assigned to the given pattern, modifying the passed stack of iotas. * @param pattern The pattern that was drawn, used to determine which operators are candidates. - * @param iotas The current stack. - * @param startingLength The length of the stack before the operator executes (used for errors). * @param env The casting environment. + * @param image The casting image. + * @param continuation The current continuation. * @return The iotas to be added to the stack. * @throws Mishap mishaps if invalid input to the operators is given by the caster. */ - public Iterable run(HexPattern pattern, Stack iotas, int startingLength, CastingEnvironment env) throws Mishap { + public OperationResult run(HexPattern pattern, CastingEnvironment env, CastingImage image, SpellContinuation continuation) throws Mishap { + var stackList = image.getStack(); + var stack = new Stack(); + stack.addAll(stackList); + var startingLength = stackList.size(); + var candidates = operators.get(pattern); if (candidates == null) throw new InvalidOperatorException("the pattern " + pattern + " is not an operator."); // HashCons hash = new HashCons.Pattern(pattern); var args = new ArrayList(candidates.arity()); for (var i = 0; i < candidates.arity(); i++) { - if (iotas.isEmpty()) { + if (stack.isEmpty()) { throw new MishapNotEnoughArgs(candidates.arity, startingLength); } - var iota = iotas.pop(); + var iota = stack.pop(); hash = new HashCons.Pair(iota.getType(), hash); args.add(iota); } Collections.reverse(args); var op = resolveCandidates(args, hash, candidates); - return op.apply(args, env); + return op.operate(env, image, continuation); } private Operator resolveCandidates(List args, HashCons hash, OpCandidates candidates) { diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/Operator.java b/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/Operator.java deleted file mode 100644 index a94ab75831..0000000000 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/Operator.java +++ /dev/null @@ -1,55 +0,0 @@ -package at.petrak.hexcasting.api.casting.arithmetic.operator; - -import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaMultiPredicate; -import at.petrak.hexcasting.api.casting.eval.CastingEnvironment; -import at.petrak.hexcasting.api.casting.iota.Iota; -import at.petrak.hexcasting.api.casting.iota.IotaType; -import at.petrak.hexcasting.api.casting.mishaps.Mishap; -import org.jetbrains.annotations.NotNull; - -/** - * Represents an Operator, similar to Action except that it also has a defined set of IotaTypes that it accepts, and - * there can be multiple Operators 'assigned' to the same pattern in different Arithmetics as long as they don't have - * overlapping matched types. (Overlapping matched types is not checked for, but will have undefined behaviour). - */ -public abstract class Operator { - /** - * The number of arguments from the stack that this Operator requires; all Operators with the same pattern must have - * the same arity. - */ - public final int arity; - - /** - * A function that should return true if the passed list of Iotas satisfies this Operator's type constraints, and false otherwise. - */ - public final IotaMultiPredicate accepts; - - /** - * @param arity The number of arguments from the stack that this Operator requires; all Operators with the same pattern must have arity. - * @param accepts A function that should return true if the passed list of Iotas satisfies this Operator's type constraints, and false otherwise. - */ - public Operator(int arity, IotaMultiPredicate accepts) { - this.arity = arity; - this.accepts = accepts; - } - - /** - /** - * The method called when this Operator is actually acting on the stack, for real. - * @param iotas An iterable of iotas with {@link Operator#arity} elements that satisfied {@link Operator#accepts}. - * @param env The casting environment, to make use of if this operator needs it. - * @return the iotas that this operator will return to the stack (with the first element of the returned iterable being placed deepest into the stack, and the last element on top of the stack). - * @throws Mishap if the Operator mishaps for any reason it will be passed up the chain. - */ - public abstract @NotNull Iterable apply(@NotNull Iterable iotas, @NotNull CastingEnvironment env) throws Mishap; - - /** - * A helper method to take an iota that you know is of iotaType and returning it as an iota of that type. - */ - @SuppressWarnings("unchecked") - public static T downcast(Iota iota, IotaType iotaType) { - if (iota.getType() != iotaType) - throw new IllegalStateException("Attempting to downcast " + iota + " to type: " + iotaType); - return (T) iota; - } -} diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/Operator.kt b/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/Operator.kt new file mode 100644 index 0000000000..df97cd2737 --- /dev/null +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/Operator.kt @@ -0,0 +1,64 @@ +package at.petrak.hexcasting.api.casting.arithmetic.operator + +import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaMultiPredicate +import at.petrak.hexcasting.api.casting.eval.CastingEnvironment +import at.petrak.hexcasting.api.casting.eval.OperationResult +import at.petrak.hexcasting.api.casting.eval.vm.CastingImage +import at.petrak.hexcasting.api.casting.eval.vm.SpellContinuation +import at.petrak.hexcasting.api.casting.iota.Iota +import at.petrak.hexcasting.api.casting.iota.IotaType +import at.petrak.hexcasting.api.casting.mishaps.Mishap +import at.petrak.hexcasting.common.lib.hex.HexEvalSounds +import java.awt.Image +import java.util.function.Consumer + +abstract class Operator +/** + * @param arity The number of arguments from the stack that this Operator requires; all Operators with the same pattern must have arity. + * @param accepts A function that should return true if the passed list of Iotas satisfies this Operator's type constraints, and false otherwise. + */ + ( + @JvmField + val arity: Int, + @JvmField + val accepts: IotaMultiPredicate? +) { + + /** + * Functionally update the image. Return the image and any side effects. + */ + @Throws(Mishap::class) + fun operate(env: CastingEnvironment, image: CastingImage, continuation: SpellContinuation): OperationResult { + val stack = image.stack.toMutableList() + val args = stack.takeLast(arity) + repeat(arity) { stack.removeLast() } + + val ret = apply(args, env) + ret.forEach(Consumer { e: Iota -> stack.add(e) }) + + val image2 = image.copy(stack = stack, opsConsumed = image.opsConsumed + 1) + return OperationResult(image2, listOf(), continuation, HexEvalSounds.NORMAL_EXECUTE) + } + + /** + * / ** + * The method called when this Operator is actually acting on the stack, for real. + * @param iotas An iterable of iotas with [Operator.arity] elements that satisfied [Operator.accepts]. + * @param env The casting environment, to make use of if this operator needs it. + * @return the iotas that this operator will return to the stack (with the first element of the returned iterable being placed deepest into the stack, and the last element on top of the stack). + * @throws Mishap if the Operator mishaps for any reason it will be passed up the chain. + */ + @Throws(Mishap::class) + abstract fun apply(iotas: Iterable, env: CastingEnvironment): Iterable + + companion object { + /** + * A helper method to take an iota that you know is of iotaType and returning it as an iota of that type. + */ + @JvmStatic + fun downcast(iota: Iota, iotaType: IotaType): T { + check(iota.type === iotaType) { "Attempting to downcast $iota to type: $iotaType" } + return iota as T + } + } +} \ No newline at end of file diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/castables/OperationAction.kt b/Common/src/main/java/at/petrak/hexcasting/api/casting/castables/OperationAction.kt index 0032d6cecb..54f1e92a61 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/castables/OperationAction.kt +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/castables/OperationAction.kt @@ -19,15 +19,8 @@ import java.util.function.Consumer */ data class OperationAction(val pattern: HexPattern) : Action { override fun operate(env: CastingEnvironment, image: CastingImage, continuation: SpellContinuation): OperationResult { - val stackList = image.stack - val stack = Stack() - stack.addAll(stackList) - val startingLength = stackList.size return try { - val ret: Iterable = HexArithmetics.getEngine().run(pattern, stack, startingLength, env) - ret.forEach(Consumer { e: Iota -> stack.add(e) }) - val image2 = image.copy(stack = stack, opsConsumed = image.opsConsumed + 1) // TODO: maybe let operators figure out how many ops to consume? - OperationResult(image2, listOf(), continuation, HexEvalSounds.NORMAL_EXECUTE) + HexArithmetics.getEngine().run(pattern, env, image, continuation) } catch (e: NoOperatorCandidatesException) { throw MishapInvalidOperatorArgs(e.args, e.pattern) } From dc371205684022df3589b57b4bdd26f4952d7d66 Mon Sep 17 00:00:00 2001 From: Master-Bw3 Date: Thu, 16 Nov 2023 14:11:10 -0600 Subject: [PATCH 2/4] fix imports --- .../api/casting/arithmetic/operator/OperatorBinary.java | 2 +- .../api/casting/arithmetic/operator/OperatorUnary.java | 2 +- .../common/casting/arithmetic/BitwiseSetArithmetic.kt | 2 +- .../hexcasting/common/casting/arithmetic/ListArithmetic.kt | 2 +- .../hexcasting/common/casting/arithmetic/ListSetArithmetic.kt | 1 + .../common/casting/arithmetic/operator/vec/OperatorPack.java | 4 ++-- .../casting/arithmetic/operator/vec/OperatorUnpack.java | 4 ++-- .../arithmetic/operator/vec/OperatorVec3Delegating.java | 4 ++-- 8 files changed, 11 insertions(+), 10 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/OperatorBinary.java b/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/OperatorBinary.java index 5c3c46a2a1..ca10400754 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/OperatorBinary.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/OperatorBinary.java @@ -21,7 +21,7 @@ public OperatorBinary(IotaMultiPredicate accepts, BinaryOperator inner) { } @Override - public @NotNull Iterable apply(@NotNull Iterable iotas, @NotNull CastingEnvironment env) { + public @NotNull Iterable apply(Iterable iotas, CastingEnvironment env) { var it = iotas.iterator(); return List.of(inner.apply(it.next(), it.next())); } diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/OperatorUnary.java b/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/OperatorUnary.java index a6dbbdf0fa..4e4a9e0f57 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/OperatorUnary.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/OperatorUnary.java @@ -21,7 +21,7 @@ public OperatorUnary(IotaMultiPredicate accepts, UnaryOperator inner) { } @Override - public @NotNull Iterable apply(@NotNull Iterable iotas, @NotNull CastingEnvironment env) { + public @NotNull Iterable apply(Iterable iotas, CastingEnvironment env) { return List.of(inner.apply(iotas.iterator().next())); } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/BitwiseSetArithmetic.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/BitwiseSetArithmetic.kt index 1063f2984f..715297a051 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/BitwiseSetArithmetic.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/BitwiseSetArithmetic.kt @@ -4,7 +4,7 @@ import at.petrak.hexcasting.api.casting.arithmetic.Arithmetic import at.petrak.hexcasting.api.casting.arithmetic.Arithmetic.* import at.petrak.hexcasting.api.casting.arithmetic.engine.InvalidOperatorException import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator -import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator.downcast +import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator.Companion.downcast import at.petrak.hexcasting.api.casting.arithmetic.operator.OperatorBinary import at.petrak.hexcasting.api.casting.arithmetic.operator.OperatorUnary import at.petrak.hexcasting.api.casting.iota.DoubleIota diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/ListArithmetic.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/ListArithmetic.kt index ddfb3a409a..35a34e61ec 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/ListArithmetic.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/ListArithmetic.kt @@ -5,7 +5,7 @@ import at.petrak.hexcasting.api.casting.arithmetic.Arithmetic import at.petrak.hexcasting.api.casting.arithmetic.Arithmetic.* import at.petrak.hexcasting.api.casting.arithmetic.engine.InvalidOperatorException import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator -import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator.downcast +import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator.Companion.downcast import at.petrak.hexcasting.api.casting.arithmetic.operator.OperatorBinary import at.petrak.hexcasting.api.casting.arithmetic.operator.OperatorUnary import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaMultiPredicate.all diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/ListSetArithmetic.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/ListSetArithmetic.kt index 4209952b66..d9f6b985b1 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/ListSetArithmetic.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/ListSetArithmetic.kt @@ -5,6 +5,7 @@ import at.petrak.hexcasting.api.casting.arithmetic.Arithmetic.* import at.petrak.hexcasting.api.casting.arithmetic.engine.InvalidOperatorException import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator.* +import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator.Companion.downcast import at.petrak.hexcasting.api.casting.arithmetic.operator.OperatorBinary import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaMultiPredicate.* import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaPredicate diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorPack.java b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorPack.java index f6621468c5..175a0b79ae 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorPack.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorPack.java @@ -1,9 +1,9 @@ package at.petrak.hexcasting.common.casting.arithmetic.operator.vec; +import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator; import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaMultiPredicate; import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaPredicate; -import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator; import at.petrak.hexcasting.api.casting.eval.CastingEnvironment; import at.petrak.hexcasting.api.casting.iota.Iota; import at.petrak.hexcasting.api.casting.iota.Vec3Iota; @@ -21,7 +21,7 @@ private OperatorPack() { public static OperatorPack INSTANCE = new OperatorPack(); @Override - public @NotNull Iterable apply(@NotNull Iterable iotas, @NotNull CastingEnvironment env) { + public @NotNull Iterable apply(Iterable iotas, CastingEnvironment env) { var it = iotas.iterator(); return List.of(new Vec3Iota(new Vec3( downcast(it.next(), HexIotaTypes.DOUBLE).getDouble(), diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorUnpack.java b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorUnpack.java index 9a51d6d714..86176c66b2 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorUnpack.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorUnpack.java @@ -1,9 +1,9 @@ package at.petrak.hexcasting.common.casting.arithmetic.operator.vec; +import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator; import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaMultiPredicate; import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaPredicate; -import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator; import at.petrak.hexcasting.api.casting.eval.CastingEnvironment; import at.petrak.hexcasting.api.casting.iota.DoubleIota; import at.petrak.hexcasting.api.casting.iota.Iota; @@ -22,7 +22,7 @@ private OperatorUnpack() { public static OperatorUnpack INSTANCE = new OperatorUnpack(); @Override - public @NotNull Iterable apply(@NotNull Iterable iotas, @NotNull CastingEnvironment env) { + public @NotNull Iterable apply(Iterable iotas, CastingEnvironment env) { var it = iotas.iterator(); var vec = downcast(it.next(), VEC3).getVec3(); return List.of(new DoubleIota(vec.x), new DoubleIota(vec.y), new DoubleIota(vec.z)); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorVec3Delegating.java b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorVec3Delegating.java index fdce8c958c..a6d7b88436 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorVec3Delegating.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorVec3Delegating.java @@ -1,10 +1,10 @@ package at.petrak.hexcasting.common.casting.arithmetic.operator.vec; +import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator; import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaMultiPredicate; import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaPredicate; import at.petrak.hexcasting.api.casting.arithmetic.IterPair; import at.petrak.hexcasting.api.casting.arithmetic.TripleIterable; -import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator; import at.petrak.hexcasting.api.casting.eval.CastingEnvironment; import at.petrak.hexcasting.api.casting.mishaps.Mishap; import at.petrak.hexcasting.api.casting.mishaps.MishapDivideByZero; @@ -33,7 +33,7 @@ public OperatorVec3Delegating(BiFunction core, HexPattern fall } @Override - public @NotNull Iterable apply(@NotNull Iterable iotas, @NotNull CastingEnvironment env) throws Mishap { + public @NotNull Iterable apply(Iterable iotas, CastingEnvironment env) throws Mishap { var it = iotas.iterator(); var left = it.next(); var right = it.next(); From ed3d3f13d25f5bc61a2c78542c6244cffce64431 Mon Sep 17 00:00:00 2001 From: Master-Bw3 Date: Thu, 16 Nov 2023 14:14:48 -0600 Subject: [PATCH 3/4] remove unused imports and fix annotations --- .../hexcasting/api/casting/arithmetic/operator/Operator.kt | 1 - .../api/casting/arithmetic/operator/OperatorBinary.java | 2 +- .../api/casting/arithmetic/operator/OperatorUnary.java | 2 +- .../hexcasting/api/casting/castables/OperationAction.kt | 4 ---- .../hexcasting/common/casting/arithmetic/ListSetArithmetic.kt | 1 - .../common/casting/arithmetic/operator/vec/OperatorPack.java | 2 +- .../casting/arithmetic/operator/vec/OperatorUnpack.java | 2 +- .../arithmetic/operator/vec/OperatorVec3Delegating.java | 2 +- 8 files changed, 5 insertions(+), 11 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/Operator.kt b/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/Operator.kt index df97cd2737..3387c467d7 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/Operator.kt +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/Operator.kt @@ -9,7 +9,6 @@ import at.petrak.hexcasting.api.casting.iota.Iota import at.petrak.hexcasting.api.casting.iota.IotaType import at.petrak.hexcasting.api.casting.mishaps.Mishap import at.petrak.hexcasting.common.lib.hex.HexEvalSounds -import java.awt.Image import java.util.function.Consumer abstract class Operator diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/OperatorBinary.java b/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/OperatorBinary.java index ca10400754..a9123c60c8 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/OperatorBinary.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/OperatorBinary.java @@ -21,7 +21,7 @@ public OperatorBinary(IotaMultiPredicate accepts, BinaryOperator inner) { } @Override - public @NotNull Iterable apply(Iterable iotas, CastingEnvironment env) { + public @NotNull Iterable apply(Iterable iotas, @NotNull CastingEnvironment env) { var it = iotas.iterator(); return List.of(inner.apply(it.next(), it.next())); } diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/OperatorUnary.java b/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/OperatorUnary.java index 4e4a9e0f57..1fa5cd9357 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/OperatorUnary.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/OperatorUnary.java @@ -21,7 +21,7 @@ public OperatorUnary(IotaMultiPredicate accepts, UnaryOperator inner) { } @Override - public @NotNull Iterable apply(Iterable iotas, CastingEnvironment env) { + public @NotNull Iterable apply(Iterable iotas, @NotNull CastingEnvironment env) { return List.of(inner.apply(iotas.iterator().next())); } } diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/castables/OperationAction.kt b/Common/src/main/java/at/petrak/hexcasting/api/casting/castables/OperationAction.kt index 54f1e92a61..c2c5b06ee3 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/castables/OperationAction.kt +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/castables/OperationAction.kt @@ -5,13 +5,9 @@ import at.petrak.hexcasting.api.casting.eval.CastingEnvironment import at.petrak.hexcasting.api.casting.eval.OperationResult import at.petrak.hexcasting.api.casting.eval.vm.CastingImage import at.petrak.hexcasting.api.casting.eval.vm.SpellContinuation -import at.petrak.hexcasting.api.casting.iota.Iota import at.petrak.hexcasting.api.casting.math.HexPattern import at.petrak.hexcasting.api.casting.mishaps.MishapInvalidOperatorArgs import at.petrak.hexcasting.common.lib.hex.HexArithmetics -import at.petrak.hexcasting.common.lib.hex.HexEvalSounds -import java.util.* -import java.util.function.Consumer /** * Represents an Operator with the give pattern as its identifier, a special type of Action that calls a different function depending on the type of its arguments. diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/ListSetArithmetic.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/ListSetArithmetic.kt index d9f6b985b1..d412c66652 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/ListSetArithmetic.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/ListSetArithmetic.kt @@ -4,7 +4,6 @@ import at.petrak.hexcasting.api.casting.arithmetic.Arithmetic import at.petrak.hexcasting.api.casting.arithmetic.Arithmetic.* import at.petrak.hexcasting.api.casting.arithmetic.engine.InvalidOperatorException import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator -import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator.* import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator.Companion.downcast import at.petrak.hexcasting.api.casting.arithmetic.operator.OperatorBinary import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaMultiPredicate.* diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorPack.java b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorPack.java index 175a0b79ae..fb21514a98 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorPack.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorPack.java @@ -21,7 +21,7 @@ private OperatorPack() { public static OperatorPack INSTANCE = new OperatorPack(); @Override - public @NotNull Iterable apply(Iterable iotas, CastingEnvironment env) { + public @NotNull Iterable apply(Iterable iotas, @NotNull CastingEnvironment env) { var it = iotas.iterator(); return List.of(new Vec3Iota(new Vec3( downcast(it.next(), HexIotaTypes.DOUBLE).getDouble(), diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorUnpack.java b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorUnpack.java index 86176c66b2..676129fb2d 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorUnpack.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorUnpack.java @@ -22,7 +22,7 @@ private OperatorUnpack() { public static OperatorUnpack INSTANCE = new OperatorUnpack(); @Override - public @NotNull Iterable apply(Iterable iotas, CastingEnvironment env) { + public @NotNull Iterable apply(Iterable iotas, @NotNull CastingEnvironment env) { var it = iotas.iterator(); var vec = downcast(it.next(), VEC3).getVec3(); return List.of(new DoubleIota(vec.x), new DoubleIota(vec.y), new DoubleIota(vec.z)); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorVec3Delegating.java b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorVec3Delegating.java index a6d7b88436..015a60ecbf 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorVec3Delegating.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorVec3Delegating.java @@ -33,7 +33,7 @@ public OperatorVec3Delegating(BiFunction core, HexPattern fall } @Override - public @NotNull Iterable apply(Iterable iotas, CastingEnvironment env) throws Mishap { + public @NotNull Iterable apply(Iterable iotas, @NotNull CastingEnvironment env) throws Mishap { var it = iotas.iterator(); var left = it.next(); var right = it.next(); From de01f67140c8579175d2fafbd71c2c14153cf33f Mon Sep 17 00:00:00 2001 From: Master-Bw3 Date: Fri, 17 Nov 2023 10:44:48 -0600 Subject: [PATCH 4/4] remove apply from Operator and put it into OperatorBasic --- .../casting/arithmetic/operator/Operator.kt | 24 +----------- .../arithmetic/operator/OperatorBasic.kt | 39 +++++++++++++++++++ .../arithmetic/operator/OperatorBinary.java | 2 +- .../arithmetic/operator/OperatorUnary.java | 2 +- .../arithmetic/operator/OperatorLog.kt | 3 +- .../operator/list/OperatorAppend.kt | 3 +- .../arithmetic/operator/list/OperatorIndex.kt | 3 +- .../operator/list/OperatorIndexOf.kt | 3 +- .../operator/list/OperatorRemove.kt | 3 +- .../operator/list/OperatorReplace.kt | 3 +- .../arithmetic/operator/list/OperatorSlice.kt | 3 +- .../operator/list/OperatorUnCons.kt | 3 +- .../operator/list/OperatorUnappend.kt | 3 +- .../operator/list/OperatorUnique.kt | 3 +- .../arithmetic/operator/vec/OperatorPack.java | 3 +- .../operator/vec/OperatorUnpack.java | 3 +- .../operator/vec/OperatorVec3Delegating.java | 9 +++-- 17 files changed, 72 insertions(+), 40 deletions(-) create mode 100644 Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/OperatorBasic.kt diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/Operator.kt b/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/Operator.kt index 3387c467d7..8804e0d628 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/Operator.kt +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/Operator.kt @@ -20,35 +20,15 @@ abstract class Operator @JvmField val arity: Int, @JvmField - val accepts: IotaMultiPredicate? + val accepts: IotaMultiPredicate ) { /** * Functionally update the image. Return the image and any side effects. */ @Throws(Mishap::class) - fun operate(env: CastingEnvironment, image: CastingImage, continuation: SpellContinuation): OperationResult { - val stack = image.stack.toMutableList() - val args = stack.takeLast(arity) - repeat(arity) { stack.removeLast() } + abstract fun operate(env: CastingEnvironment, image: CastingImage, continuation: SpellContinuation): OperationResult - val ret = apply(args, env) - ret.forEach(Consumer { e: Iota -> stack.add(e) }) - - val image2 = image.copy(stack = stack, opsConsumed = image.opsConsumed + 1) - return OperationResult(image2, listOf(), continuation, HexEvalSounds.NORMAL_EXECUTE) - } - - /** - * / ** - * The method called when this Operator is actually acting on the stack, for real. - * @param iotas An iterable of iotas with [Operator.arity] elements that satisfied [Operator.accepts]. - * @param env The casting environment, to make use of if this operator needs it. - * @return the iotas that this operator will return to the stack (with the first element of the returned iterable being placed deepest into the stack, and the last element on top of the stack). - * @throws Mishap if the Operator mishaps for any reason it will be passed up the chain. - */ - @Throws(Mishap::class) - abstract fun apply(iotas: Iterable, env: CastingEnvironment): Iterable companion object { /** diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/OperatorBasic.kt b/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/OperatorBasic.kt new file mode 100644 index 0000000000..1d43c890ce --- /dev/null +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/OperatorBasic.kt @@ -0,0 +1,39 @@ +package at.petrak.hexcasting.api.casting.arithmetic.operator + +import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaMultiPredicate +import at.petrak.hexcasting.api.casting.eval.CastingEnvironment +import at.petrak.hexcasting.api.casting.eval.OperationResult +import at.petrak.hexcasting.api.casting.eval.vm.CastingImage +import at.petrak.hexcasting.api.casting.eval.vm.SpellContinuation +import at.petrak.hexcasting.api.casting.iota.Iota +import at.petrak.hexcasting.api.casting.mishaps.Mishap +import at.petrak.hexcasting.common.lib.hex.HexEvalSounds +import java.util.function.Consumer + +abstract class OperatorBasic(arity: Int, accepts: IotaMultiPredicate) : Operator(arity, accepts) { + + @Throws(Mishap::class) + override fun operate(env: CastingEnvironment, image: CastingImage, continuation: SpellContinuation): OperationResult { + val stack = image.stack.toMutableList() + val args = stack.takeLast(arity) + repeat(arity) { stack.removeLast() } + + val ret = apply(args, env) + ret.forEach(Consumer { e: Iota -> stack.add(e) }) + + val image2 = image.copy(stack = stack, opsConsumed = image.opsConsumed + 1) + return OperationResult(image2, listOf(), continuation, HexEvalSounds.NORMAL_EXECUTE) + } + + /** + * / ** + * The method called when this Operator is actually acting on the stack, for real. + * @param iotas An iterable of iotas with [Operator.arity] elements that satisfied [Operator.accepts]. + * @param env The casting environment, to make use of if this operator needs it. + * @return the iotas that this operator will return to the stack (with the first element of the returned iterable being placed deepest into the stack, and the last element on top of the stack). + * @throws Mishap if the Operator mishaps for any reason it will be passed up the chain. + */ + @Throws(Mishap::class) + abstract fun apply(iotas: Iterable, env: CastingEnvironment): Iterable + +} \ No newline at end of file diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/OperatorBinary.java b/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/OperatorBinary.java index a9123c60c8..02914dc4d1 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/OperatorBinary.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/OperatorBinary.java @@ -12,7 +12,7 @@ /** * A helper class for defining {@link Operator}s of two iotas. */ -public class OperatorBinary extends Operator { +public class OperatorBinary extends OperatorBasic { public BinaryOperator inner; public OperatorBinary(IotaMultiPredicate accepts, BinaryOperator inner) { diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/OperatorUnary.java b/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/OperatorUnary.java index 1fa5cd9357..9797b83b1d 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/OperatorUnary.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/OperatorUnary.java @@ -12,7 +12,7 @@ /** * A helper class for defining {@link Operator}s of one iota. */ -public class OperatorUnary extends Operator { +public class OperatorUnary extends OperatorBasic { public UnaryOperator inner; public OperatorUnary(IotaMultiPredicate accepts, UnaryOperator inner) { diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/OperatorLog.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/OperatorLog.kt index 4cd8bcd507..0a36d8ac16 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/OperatorLog.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/OperatorLog.kt @@ -1,6 +1,7 @@ package at.petrak.hexcasting.common.casting.arithmetic.operator import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator +import at.petrak.hexcasting.api.casting.arithmetic.operator.OperatorBasic import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaMultiPredicate import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaPredicate import at.petrak.hexcasting.api.casting.asActionResult @@ -10,7 +11,7 @@ import at.petrak.hexcasting.api.casting.mishaps.MishapDivideByZero import at.petrak.hexcasting.common.lib.hex.HexIotaTypes.DOUBLE import kotlin.math.log -object OperatorLog : Operator(2, IotaMultiPredicate.all(IotaPredicate.ofType(DOUBLE))) { +object OperatorLog : OperatorBasic(2, IotaMultiPredicate.all(IotaPredicate.ofType(DOUBLE))) { override fun apply(iotas: Iterable, env : CastingEnvironment): Iterable { val it = iotas.iterator().withIndex() val value = it.nextDouble(arity) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorAppend.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorAppend.kt index c593b5d155..724e5f6746 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorAppend.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorAppend.kt @@ -1,6 +1,7 @@ package at.petrak.hexcasting.common.casting.arithmetic.operator.list import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator +import at.petrak.hexcasting.api.casting.arithmetic.operator.OperatorBasic import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaMultiPredicate import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaPredicate import at.petrak.hexcasting.api.casting.asActionResult @@ -9,7 +10,7 @@ import at.petrak.hexcasting.api.casting.iota.Iota import at.petrak.hexcasting.common.casting.arithmetic.operator.nextList import at.petrak.hexcasting.common.lib.hex.HexIotaTypes.* -object OperatorAppend : Operator(2, IotaMultiPredicate.pair(IotaPredicate.ofType(LIST), IotaPredicate.TRUE)) { +object OperatorAppend : OperatorBasic(2, IotaMultiPredicate.pair(IotaPredicate.ofType(LIST), IotaPredicate.TRUE)) { override fun apply(iotas: Iterable, env: CastingEnvironment): Iterable { val it = iotas.iterator().withIndex() val list = it.nextList(arity).toMutableList() diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorIndex.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorIndex.kt index 59a00c23d0..2ecb5fc140 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorIndex.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorIndex.kt @@ -3,13 +3,14 @@ package at.petrak.hexcasting.common.casting.arithmetic.operator.list import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaMultiPredicate import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaPredicate import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator +import at.petrak.hexcasting.api.casting.arithmetic.operator.OperatorBasic import at.petrak.hexcasting.api.casting.eval.CastingEnvironment import at.petrak.hexcasting.api.casting.iota.Iota import at.petrak.hexcasting.api.casting.iota.NullIota import at.petrak.hexcasting.common.lib.hex.HexIotaTypes.* import kotlin.math.roundToInt -object OperatorIndex : Operator(2, IotaMultiPredicate.pair(IotaPredicate.ofType(LIST), IotaPredicate.ofType(DOUBLE))) { +object OperatorIndex : OperatorBasic(2, IotaMultiPredicate.pair(IotaPredicate.ofType(LIST), IotaPredicate.ofType(DOUBLE))) { override fun apply(iotas: Iterable, env: CastingEnvironment): Iterable { val it = iotas.iterator() val list = downcast(it.next(), LIST).list.toMutableList() diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorIndexOf.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorIndexOf.kt index a69a4d9867..a3d711d57a 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorIndexOf.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorIndexOf.kt @@ -1,6 +1,7 @@ package at.petrak.hexcasting.common.casting.arithmetic.operator.list import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator +import at.petrak.hexcasting.api.casting.arithmetic.operator.OperatorBasic import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaMultiPredicate import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaPredicate import at.petrak.hexcasting.api.casting.asActionResult @@ -9,7 +10,7 @@ import at.petrak.hexcasting.api.casting.iota.Iota import at.petrak.hexcasting.common.casting.arithmetic.operator.nextList import at.petrak.hexcasting.common.lib.hex.HexIotaTypes.* -object OperatorIndexOf : Operator(2, IotaMultiPredicate.pair(IotaPredicate.ofType(LIST), IotaPredicate.TRUE)) { +object OperatorIndexOf : OperatorBasic(2, IotaMultiPredicate.pair(IotaPredicate.ofType(LIST), IotaPredicate.TRUE)) { override fun apply(iotas: Iterable, env: CastingEnvironment): Iterable { val it = iotas.iterator().withIndex() val list = it.nextList(arity).toList() diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorRemove.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorRemove.kt index 804fe9b54c..1a1af53cfc 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorRemove.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorRemove.kt @@ -1,6 +1,7 @@ package at.petrak.hexcasting.common.casting.arithmetic.operator.list import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator +import at.petrak.hexcasting.api.casting.arithmetic.operator.OperatorBasic import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaMultiPredicate import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaPredicate import at.petrak.hexcasting.api.casting.asActionResult @@ -10,7 +11,7 @@ import at.petrak.hexcasting.common.casting.arithmetic.operator.nextInt import at.petrak.hexcasting.common.casting.arithmetic.operator.nextList import at.petrak.hexcasting.common.lib.hex.HexIotaTypes.* -object OperatorRemove : Operator(2, IotaMultiPredicate.pair(IotaPredicate.ofType(LIST), IotaPredicate.ofType(DOUBLE))) { +object OperatorRemove : OperatorBasic(2, IotaMultiPredicate.pair(IotaPredicate.ofType(LIST), IotaPredicate.ofType(DOUBLE))) { override fun apply(iotas: Iterable, env: CastingEnvironment): Iterable { val it = iotas.iterator().withIndex() val list = it.nextList(arity).toMutableList() diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorReplace.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorReplace.kt index 4773d3673e..ca976369c2 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorReplace.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorReplace.kt @@ -2,6 +2,7 @@ package at.petrak.hexcasting.common.casting.arithmetic.operator.list import at.petrak.hexcasting.api.casting.SpellList import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator +import at.petrak.hexcasting.api.casting.arithmetic.operator.OperatorBasic import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaMultiPredicate import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaPredicate import at.petrak.hexcasting.api.casting.asActionResult @@ -11,7 +12,7 @@ import at.petrak.hexcasting.common.casting.arithmetic.operator.nextList import at.petrak.hexcasting.common.casting.arithmetic.operator.nextPositiveIntUnder import at.petrak.hexcasting.common.lib.hex.HexIotaTypes.* -object OperatorReplace : Operator(3, IotaMultiPredicate.triple(IotaPredicate.ofType(LIST), IotaPredicate.ofType(DOUBLE), IotaPredicate.TRUE)) { +object OperatorReplace : OperatorBasic(3, IotaMultiPredicate.triple(IotaPredicate.ofType(LIST), IotaPredicate.ofType(DOUBLE), IotaPredicate.TRUE)) { override fun apply(iotas: Iterable, env: CastingEnvironment): Iterable { val it = iotas.iterator().withIndex() val list = it.nextList(arity) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorSlice.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorSlice.kt index 32f48b4520..d4e8c5f8ec 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorSlice.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorSlice.kt @@ -3,6 +3,7 @@ package at.petrak.hexcasting.common.casting.arithmetic.operator.list import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaMultiPredicate import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaPredicate import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator +import at.petrak.hexcasting.api.casting.arithmetic.operator.OperatorBasic import at.petrak.hexcasting.api.casting.asActionResult import at.petrak.hexcasting.api.casting.eval.CastingEnvironment import at.petrak.hexcasting.api.casting.iota.Iota @@ -12,7 +13,7 @@ import at.petrak.hexcasting.common.lib.hex.HexIotaTypes.* import kotlin.math.max import kotlin.math.min -object OperatorSlice : Operator(3, IotaMultiPredicate.triple(IotaPredicate.ofType(LIST), IotaPredicate.ofType(DOUBLE), IotaPredicate.ofType(DOUBLE))) { +object OperatorSlice : OperatorBasic(3, IotaMultiPredicate.triple(IotaPredicate.ofType(LIST), IotaPredicate.ofType(DOUBLE), IotaPredicate.ofType(DOUBLE))) { override fun apply(iotas: Iterable, env: CastingEnvironment): Iterable { val it = iotas.iterator().withIndex() val list = it.nextList(arity).toList() diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorUnCons.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorUnCons.kt index 336e9ff899..54f0de69c2 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorUnCons.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorUnCons.kt @@ -1,6 +1,7 @@ package at.petrak.hexcasting.common.casting.arithmetic.operator.list import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator +import at.petrak.hexcasting.api.casting.arithmetic.operator.OperatorBasic import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaMultiPredicate import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaPredicate import at.petrak.hexcasting.api.casting.eval.CastingEnvironment @@ -10,7 +11,7 @@ import at.petrak.hexcasting.api.casting.iota.NullIota import at.petrak.hexcasting.common.casting.arithmetic.operator.nextList import at.petrak.hexcasting.common.lib.hex.HexIotaTypes.LIST -object OperatorUnCons : Operator(1, IotaMultiPredicate.all(IotaPredicate.ofType(LIST))) { +object OperatorUnCons : OperatorBasic(1, IotaMultiPredicate.all(IotaPredicate.ofType(LIST))) { override fun apply(iotas: Iterable, env: CastingEnvironment): Iterable { val it = iotas.iterator().withIndex() val list = it.nextList(arity) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorUnappend.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorUnappend.kt index 5ca9447232..6d60362b0d 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorUnappend.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorUnappend.kt @@ -1,6 +1,7 @@ package at.petrak.hexcasting.common.casting.arithmetic.operator.list import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator +import at.petrak.hexcasting.api.casting.arithmetic.operator.OperatorBasic import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaMultiPredicate import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaPredicate import at.petrak.hexcasting.api.casting.eval.CastingEnvironment @@ -10,7 +11,7 @@ import at.petrak.hexcasting.api.casting.iota.NullIota import at.petrak.hexcasting.common.casting.arithmetic.operator.nextList import at.petrak.hexcasting.common.lib.hex.HexIotaTypes.* -object OperatorUnappend : Operator(1, IotaMultiPredicate.all(IotaPredicate.ofType(LIST))) { +object OperatorUnappend : OperatorBasic(1, IotaMultiPredicate.all(IotaPredicate.ofType(LIST))) { override fun apply(iotas: Iterable, env: CastingEnvironment): Iterable { val it = iotas.iterator().withIndex() val list = it.nextList(arity).toMutableList() diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorUnique.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorUnique.kt index 27d88da095..b3cb19ec28 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorUnique.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/list/OperatorUnique.kt @@ -1,6 +1,7 @@ package at.petrak.hexcasting.common.casting.arithmetic.operator.list import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator +import at.petrak.hexcasting.api.casting.arithmetic.operator.OperatorBasic import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaMultiPredicate import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaPredicate import at.petrak.hexcasting.api.casting.asActionResult @@ -10,7 +11,7 @@ import at.petrak.hexcasting.common.casting.arithmetic.operator.nextList import at.petrak.hexcasting.common.casting.actions.math.bit.OpToSet import at.petrak.hexcasting.common.lib.hex.HexIotaTypes.LIST -object OperatorUnique : Operator(1, IotaMultiPredicate.all(IotaPredicate.ofType(LIST))) { +object OperatorUnique : OperatorBasic(1, IotaMultiPredicate.all(IotaPredicate.ofType(LIST))) { override fun apply(iotas: Iterable, env: CastingEnvironment): Iterable { val it = iotas.iterator().withIndex() val list = it.nextList(OpToSet.argc) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorPack.java b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorPack.java index fb21514a98..d30b8edcbc 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorPack.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorPack.java @@ -2,6 +2,7 @@ import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator; +import at.petrak.hexcasting.api.casting.arithmetic.operator.OperatorBasic; import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaMultiPredicate; import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaPredicate; import at.petrak.hexcasting.api.casting.eval.CastingEnvironment; @@ -13,7 +14,7 @@ import java.util.List; -public class OperatorPack extends Operator { +public class OperatorPack extends OperatorBasic { private OperatorPack() { super(3, IotaMultiPredicate.all(IotaPredicate.ofType(HexIotaTypes.DOUBLE))); } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorUnpack.java b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorUnpack.java index 676129fb2d..adaeed6981 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorUnpack.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorUnpack.java @@ -2,6 +2,7 @@ import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator; +import at.petrak.hexcasting.api.casting.arithmetic.operator.OperatorBasic; import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaMultiPredicate; import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaPredicate; import at.petrak.hexcasting.api.casting.eval.CastingEnvironment; @@ -14,7 +15,7 @@ import static at.petrak.hexcasting.common.lib.hex.HexIotaTypes.VEC3; -public class OperatorUnpack extends Operator { +public class OperatorUnpack extends OperatorBasic { private OperatorUnpack() { super(1, IotaMultiPredicate.all(IotaPredicate.ofType(HexIotaTypes.VEC3))); } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorVec3Delegating.java b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorVec3Delegating.java index 015a60ecbf..25e543dfb9 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorVec3Delegating.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/vec/OperatorVec3Delegating.java @@ -1,6 +1,7 @@ package at.petrak.hexcasting.common.casting.arithmetic.operator.vec; import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator; +import at.petrak.hexcasting.api.casting.arithmetic.operator.OperatorBasic; import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaMultiPredicate; import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaPredicate; import at.petrak.hexcasting.api.casting.arithmetic.IterPair; @@ -23,13 +24,13 @@ import static at.petrak.hexcasting.common.lib.hex.HexIotaTypes.DOUBLE; import static at.petrak.hexcasting.common.lib.hex.HexIotaTypes.VEC3; -public class OperatorVec3Delegating extends Operator { +public class OperatorVec3Delegating extends OperatorBasic { private final BiFunction op; - private final Operator fb; + private final OperatorBasic fb; public OperatorVec3Delegating(BiFunction core, HexPattern fallback) { super(2, IotaMultiPredicate.any(IotaPredicate.ofType(VEC3), IotaPredicate.ofType(DOUBLE))); op = core; - fb = Objects.requireNonNull(DoubleArithmetic.INSTANCE.getOperator(fallback)); + fb = (OperatorBasic) Objects.requireNonNull(DoubleArithmetic.INSTANCE.getOperator(fallback)); } @Override @@ -57,4 +58,4 @@ public OperatorVec3Delegating(BiFunction core, HexPattern fall public static Vec3 triplicate(double in) { return new Vec3(in, in, in); } -} +} \ No newline at end of file