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..8804e0d628 --- /dev/null +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/arithmetic/operator/Operator.kt @@ -0,0 +1,43 @@ +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.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) + abstract fun operate(env: CastingEnvironment, image: CastingImage, continuation: SpellContinuation): OperationResult + + + 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/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 5c3c46a2a1..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) { @@ -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, @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 a6dbbdf0fa..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) { @@ -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, @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 0032d6cecb..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. @@ -19,15 +15,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) } 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..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,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.* +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/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 f6621468c5..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 @@ -1,9 +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.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.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; @@ -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))); } @@ -21,7 +22,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, @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 9a51d6d714..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 @@ -1,9 +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.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.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; @@ -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))); } @@ -22,7 +23,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, @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 fdce8c958c..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,10 +1,11 @@ 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; 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; @@ -23,17 +24,17 @@ 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 - public @NotNull Iterable apply(@NotNull Iterable iotas, @NotNull 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(); @@ -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