From aa476d43ecb4223e5a36f6707ca2d204f9911551 Mon Sep 17 00:00:00 2001 From: Aly Date: Mon, 27 Apr 2026 20:18:36 -0600 Subject: [PATCH] replace SpellList with TreeList in ListIota --- .../hexcasting/api/casting/ActionUtils.kt | 9 +- .../hexcasting/api/casting/SpellList.kt | 93 ------------------- .../api/casting/eval/vm/CastingVM.kt | 3 +- .../api/casting/eval/vm/ContinuationFrame.kt | 6 +- .../api/casting/eval/vm/FrameEvaluate.kt | 14 +-- .../api/casting/eval/vm/FrameForEach.kt | 17 ++-- .../hexcasting/api/casting/iota/ListIota.java | 21 ++--- .../common/casting/actions/eval/OpEval.kt | 4 +- .../common/casting/actions/lists/OpCons.kt | 3 +- .../casting/actions/lists/OpModifyInPlace.kt | 5 +- .../common/casting/actions/lists/OpUnCons.kt | 4 +- .../casting/arithmetic/ListArithmetic.kt | 5 +- .../arithmetic/operator/OperatorUtils.kt | 4 +- .../operator/list/OperatorReplace.kt | 6 +- .../operator/list/OperatorUnCons.kt | 5 +- 15 files changed, 48 insertions(+), 151 deletions(-) delete mode 100644 Common/src/main/java/at/petrak/hexcasting/api/casting/SpellList.kt diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/ActionUtils.kt b/Common/src/main/java/at/petrak/hexcasting/api/casting/ActionUtils.kt index c6dda37c9a..70fcdc99e5 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/ActionUtils.kt +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/ActionUtils.kt @@ -6,6 +6,7 @@ import at.petrak.hexcasting.api.casting.iota.* import at.petrak.hexcasting.api.casting.math.HexPattern import at.petrak.hexcasting.api.casting.mishaps.MishapInvalidIota import at.petrak.hexcasting.api.casting.mishaps.MishapNotEnoughArgs +import at.petrak.hexcasting.api.utils.TreeList import at.petrak.hexcasting.api.utils.asTranslatedComponent import com.mojang.datafixers.util.Either import net.minecraft.core.BlockPos @@ -41,7 +42,7 @@ fun List.getEntity(idx: Int, argc: Int = 0): Entity { } } -fun List.getList(idx: Int, argc: Int = 0): SpellList { +fun List.getList(idx: Int, argc: Int = 0): TreeList { val x = this.getOrElse(idx) { throw MishapNotEnoughArgs(idx + 1, this.size) } if (x is ListIota) { return x.list @@ -269,7 +270,7 @@ fun List.getNumOrVec(idx: Int, argc: Int = 0): Either { } } -fun List.getLongOrList(idx: Int, argc: Int = 0): Either { +fun List.getLongOrList(idx: Int, argc: Int = 0): Either> { val datum = this.getOrElse(idx) { throw MishapNotEnoughArgs(idx + 1, this.size) } if (datum is DoubleIota) { val double = datum.double @@ -287,7 +288,7 @@ fun List.getLongOrList(idx: Int, argc: Int = 0): Either { ) } -fun evaluatable(datum: Iota, reverseIdx: Int): Either = +fun evaluatable(datum: Iota, reverseIdx: Int): Either> = when (datum) { is ListIota -> Either.right(datum.list) else -> if (datum.executable()) Either.left(datum) else throw MishapInvalidIota( @@ -312,7 +313,7 @@ inline val Boolean.asActionResult get() = listOf(BooleanIota(this)) inline val Double.asActionResult get() = listOf(DoubleIota(this)) inline val Number.asActionResult get() = listOf(DoubleIota(this.toDouble())) -inline val SpellList.asActionResult get() = listOf(ListIota(this)) +inline val TreeList.asActionResult get() = listOf(ListIota(this)) inline val List.asActionResult get() = listOf(ListIota(this)) inline val BlockPos.asActionResult get() = listOf(Vec3Iota(Vec3.atCenterOf(this))) diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/SpellList.kt b/Common/src/main/java/at/petrak/hexcasting/api/casting/SpellList.kt deleted file mode 100644 index 2e76c18c76..0000000000 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/SpellList.kt +++ /dev/null @@ -1,93 +0,0 @@ -package at.petrak.hexcasting.api.casting - -import at.petrak.hexcasting.api.casting.iota.Iota - -/** - * Restricted interface for functional lists. - * - * ...Surely this won't have any performance implications. - */ -sealed class SpellList : Iterable { - - abstract val nonEmpty: Boolean - abstract val car: Iota - abstract val cdr: SpellList - - class LPair(override val car: Iota, override val cdr: SpellList) : SpellList() { - override val nonEmpty = true - } - - class LList(val idx: Int, val list: List) : SpellList() { - override val nonEmpty: Boolean - get() = idx < list.size - override val car: Iota - get() = list[idx] - override val cdr: SpellList - get() = LList(idx + 1, list) - - constructor(list: List) : this(0, list) - } - - fun modifyAt(startIdx: Int, modify: (SpellList) -> SpellList): SpellList { - val stack = mutableListOf() - val ptr = iterator() - var idx = startIdx - if (idx < 0) { - return this - } - while (idx > 0) { - if (!ptr.hasNext()) { - return this - } - idx-- - stack.add(ptr.next()) - } - var value = modify(ptr.list) - for (datum in stack.asReversed()) { - value = LPair(datum, value) - } - return value - } - - fun getAt(startIdx: Int): Iota { - var ptr = this - var idx = startIdx - if (idx < 0) { - throw ArrayIndexOutOfBoundsException() - } - while (idx > 0) { - when (ptr) { - is LPair -> ptr = ptr.cdr - is LList -> return ptr.list[ptr.idx + idx] - } - idx-- - } - return ptr.car - } - - override fun toString() = toList().toString() - - override fun iterator() = SpellListIterator(this) - - /** - * Note this is O(n), probably. - */ - fun size(): Int { - var size = 0 - var ptr = this - while (ptr.nonEmpty) { - ptr = ptr.cdr - size++ - } - return size - } - - class SpellListIterator(var list: SpellList) : Iterator { - override fun hasNext() = list.nonEmpty - override operator fun next(): Iota { - val car = list.car - list = list.cdr - return car - } - } -} diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/vm/CastingVM.kt b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/vm/CastingVM.kt index 11503b0b6f..8e30bfbaba 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/vm/CastingVM.kt +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/vm/CastingVM.kt @@ -2,7 +2,6 @@ package at.petrak.hexcasting.api.casting.eval.vm import at.petrak.hexcasting.api.HexAPI import at.petrak.hexcasting.api.casting.PatternShapeMatch.* -import at.petrak.hexcasting.api.casting.SpellList import at.petrak.hexcasting.api.casting.eval.* import at.petrak.hexcasting.api.casting.eval.sideeffects.OperatorSideEffect import at.petrak.hexcasting.api.casting.eval.vm.CastingImage.ParenthesizedIota @@ -40,7 +39,7 @@ class CastingVM(var image: CastingImage, val env: CastingEnvironment) { */ fun queueExecuteAndWrapIotas(iotas: List, world: ServerLevel): ExecutionClientView { // Initialize the continuation stack to a single top-level eval for all iotas. - var continuation = SpellContinuation.Done.pushFrame(FrameEvaluate(SpellList.LList(0, iotas), false)) + var continuation = SpellContinuation.Done.pushFrame(FrameEvaluate(TreeList.from(iotas), false)) // Begin aggregating info val info = TempControllerInfo(earlyExit = false) var lastResolutionType = ResolvedPatternType.UNRESOLVED diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/vm/ContinuationFrame.kt b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/vm/ContinuationFrame.kt index 8000ec09aa..072fe44a3b 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/vm/ContinuationFrame.kt +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/vm/ContinuationFrame.kt @@ -1,8 +1,8 @@ package at.petrak.hexcasting.api.casting.eval.vm -import at.petrak.hexcasting.api.casting.SpellList import at.petrak.hexcasting.api.casting.eval.CastResult import at.petrak.hexcasting.api.casting.iota.Iota +import at.petrak.hexcasting.api.utils.TreeList import at.petrak.hexcasting.common.lib.hex.HexContinuationTypes import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.Tag @@ -60,10 +60,10 @@ interface ContinuationFrame { */ @JvmStatic fun fromNBT(tag: CompoundTag, world: ServerLevel): ContinuationFrame { - val type = getTypeFromTag(tag) ?: return FrameEvaluate(SpellList.LList(0, listOf()), false) + val type = getTypeFromTag(tag) ?: return FrameEvaluate(TreeList.empty(), false) return (tag.get(HexContinuationTypes.KEY_DATA) as? CompoundTag)?.let { type.deserializeFromNBT(it, world) } - ?: FrameEvaluate(SpellList.LList(0, listOf()), false) + ?: FrameEvaluate(TreeList.empty(), false) } /** diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/vm/FrameEvaluate.kt b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/vm/FrameEvaluate.kt index 141148dfdc..17e5a12078 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/vm/FrameEvaluate.kt +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/vm/FrameEvaluate.kt @@ -1,11 +1,11 @@ package at.petrak.hexcasting.api.casting.eval.vm -import at.petrak.hexcasting.api.casting.SpellList import at.petrak.hexcasting.api.casting.eval.CastResult import at.petrak.hexcasting.api.casting.eval.ResolvedPatternType import at.petrak.hexcasting.api.casting.iota.Iota import at.petrak.hexcasting.api.casting.iota.ListIota import at.petrak.hexcasting.api.utils.NBTBuilder +import at.petrak.hexcasting.api.utils.TreeList import at.petrak.hexcasting.api.utils.getList import at.petrak.hexcasting.api.utils.serializeToNBT import at.petrak.hexcasting.common.lib.hex.HexEvalSounds @@ -19,7 +19,7 @@ import net.minecraft.server.level.ServerLevel * @property list the *remaining* list of patterns to be evaluated * @property isMetacasting only for sound effects, if this is being cast from a hermes / iris */ -data class FrameEvaluate(val list: SpellList, val isMetacasting: Boolean) : ContinuationFrame { +data class FrameEvaluate(val list: TreeList, val isMetacasting: Boolean) : ContinuationFrame { // Discard this frame and keep discarding frames. override fun breakDownwards(stack: List) = false to stack @@ -30,13 +30,13 @@ data class FrameEvaluate(val list: SpellList, val isMetacasting: Boolean) : Cont harness: CastingVM ): CastResult { // If there are patterns left... - return if (list.nonEmpty) { - val newCont = if (list.cdr.nonEmpty) { // yay TCO + return if (!list.isEmpty()) { + val newCont = if (!list.tail().isEmpty()) { // yay TCO // ...enqueue the evaluation of the rest of the patterns... - continuation.pushFrame(FrameEvaluate(list.cdr, this.isMetacasting)) + continuation.pushFrame(FrameEvaluate(list.tail(), this.isMetacasting)) } else continuation // ...before evaluating the first one in the list. - val update = harness.executeInner(list.car, level, newCont) + val update = harness.executeInner(list.head(), level, newCont) if (this.isMetacasting && update.sound != HexEvalSounds.MISHAP) { update.copy(sound = HexEvalSounds.HERMES) } else { @@ -53,7 +53,7 @@ data class FrameEvaluate(val list: SpellList, val isMetacasting: Boolean) : Cont "isMetacasting" %= isMetacasting } - override fun size() = list.size() + override fun size() = list.size override val type: ContinuationFrame.Type<*> = TYPE diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/vm/FrameForEach.kt b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/vm/FrameForEach.kt index 872bbe8e14..d4a20d73f6 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/vm/FrameForEach.kt +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/vm/FrameForEach.kt @@ -1,6 +1,5 @@ package at.petrak.hexcasting.api.casting.eval.vm -import at.petrak.hexcasting.api.casting.SpellList import at.petrak.hexcasting.api.casting.eval.CastResult import at.petrak.hexcasting.api.casting.eval.ResolvedPatternType import at.petrak.hexcasting.api.casting.iota.Iota @@ -26,16 +25,16 @@ import net.minecraft.server.level.ServerLevel * @property immutableAcc concatenated list of final stack states after Thoth exit */ data class FrameForEach( - val data: SpellList, - val code: SpellList, + val data: TreeList, + val code: TreeList, val baseStack: List?, val immutableAcc: TreeList ) : ContinuationFrame { @Deprecated("use the primary constructor that accepts a TreeList instead") constructor( - data: SpellList, - code: SpellList, + data: TreeList, + code: TreeList, baseStack: List?, acc: MutableList ) : this(data, code, baseStack, TreeList.from(acc)) @@ -66,14 +65,14 @@ data class FrameForEach( } // If we still have data to process... - val (stackTop, newImage, newCont) = if (data.nonEmpty) { + val (stackTop, newImage, newCont) = if (!data.isEmpty()) { // push the next datum to the top of the stack, val cont2 = continuation // put the next Thoth object back on the stack for the next Thoth cycle, - .pushFrame(FrameForEach(data.cdr, code, stack, newAcc)) + .pushFrame(FrameForEach(data.tail(), code, stack, newAcc)) // and prep the Thoth'd code block for evaluation. .pushFrame(FrameEvaluate(code, true)) - Triple(data.car, harness.image.withUsedOp(), cont2) + Triple(data.head(), harness.image.withUsedOp(), cont2) } else { // Else, dump our final list onto the stack. Triple(ListIota(immutableAcc), harness.image, continuation) @@ -99,7 +98,7 @@ data class FrameForEach( "accumulator" %= immutableAcc.serializeToNBT() } - override fun size() = data.size() + code.size() + immutableAcc.size + (baseStack?.size ?: 0) + override fun size() = data.size + code.size + immutableAcc.size + (baseStack?.size ?: 0) override val type: ContinuationFrame.Type<*> = TYPE diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/iota/ListIota.java b/Common/src/main/java/at/petrak/hexcasting/api/casting/iota/ListIota.java index 5a0ea6ddeb..694a0c6ee6 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/iota/ListIota.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/iota/ListIota.java @@ -1,10 +1,10 @@ package at.petrak.hexcasting.api.casting.iota; -import at.petrak.hexcasting.api.casting.SpellList; import at.petrak.hexcasting.api.utils.HexUtils; import at.petrak.hexcasting.api.utils.TreeList; import at.petrak.hexcasting.common.lib.hex.HexIotaTypes; import at.petrak.hexcasting.api.mod.HexConfig; +import java.util.ListIterator; import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; @@ -20,13 +20,13 @@ import static java.lang.Math.max; /** - * This is a wrapper for {@link SpellList}. + * This is a wrapper for {@link TreeList} of {@link Iota}. */ public class ListIota extends Iota { private final int depth; private final int size; - public ListIota(@NotNull SpellList list) { + public ListIota(@NotNull TreeList list) { super(HexIotaTypes.LIST, list); int maxChildDepth = 0; int totalSize = 1; @@ -38,21 +38,18 @@ public ListIota(@NotNull SpellList list) { size = totalSize; } - public ListIota(@NotNull TreeList list) { - this(new SpellList.LList(list)); - } - public ListIota(@NotNull List list) { - this(new SpellList.LList(list)); + this(TreeList.from(list)); } - public SpellList getList() { - return (SpellList) this.payload; + @SuppressWarnings("unchecked") + public TreeList getList() { + return (TreeList) this.payload; } @Override public boolean isTruthy() { - return this.getList().getNonEmpty(); + return !this.getList().isEmpty(); } @Override @@ -66,7 +63,7 @@ public boolean toleratesOther(Iota that) { } var b = list.getList(); - SpellList.SpellListIterator aIter = a.iterator(), bIter = b.iterator(); + ListIterator aIter = a.iterator(), bIter = b.iterator(); for (; ; ) { if (!aIter.hasNext() && !bIter.hasNext()) { // we ran out together! diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/eval/OpEval.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/eval/OpEval.kt index e9c9adf2a1..1b00f68453 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/eval/OpEval.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/eval/OpEval.kt @@ -1,6 +1,5 @@ package at.petrak.hexcasting.common.casting.actions.eval -import at.petrak.hexcasting.api.casting.SpellList import at.petrak.hexcasting.api.casting.castables.Action import at.petrak.hexcasting.api.casting.eval.CastingEnvironment import at.petrak.hexcasting.api.casting.eval.OperationResult @@ -11,6 +10,7 @@ import at.petrak.hexcasting.api.casting.eval.vm.SpellContinuation import at.petrak.hexcasting.api.casting.evaluatable import at.petrak.hexcasting.api.casting.iota.Iota import at.petrak.hexcasting.api.casting.mishaps.MishapNotEnoughArgs +import at.petrak.hexcasting.api.utils.TreeList import at.petrak.hexcasting.common.lib.hex.HexEvalSounds object OpEval : Action { @@ -30,7 +30,7 @@ object OpEval : Action { continuation.pushFrame(FrameFinishEval) // install a break-boundary after eval } - val instrsList = instrs.map({ SpellList.LList(0, listOf(it)) }, { it }) + val instrsList = instrs.map({ TreeList.from(listOf(it)) }, { it }) val frame = FrameEvaluate(instrsList, true) val image2 = image.withUsedOp().copy(stack = newStack) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpCons.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpCons.kt index b0ec3173fc..2db64a4427 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpCons.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpCons.kt @@ -1,6 +1,5 @@ package at.petrak.hexcasting.common.casting.actions.lists -import at.petrak.hexcasting.api.casting.SpellList import at.petrak.hexcasting.api.casting.asActionResult import at.petrak.hexcasting.api.casting.castables.ConstMediaAction import at.petrak.hexcasting.api.casting.eval.CastingEnvironment @@ -12,6 +11,6 @@ object OpCons : ConstMediaAction { override fun execute(args: List, env: CastingEnvironment): List { val bottom = args.getList(0, argc) val top = args[1] - return SpellList.LPair(top, bottom).asActionResult + return bottom.prepended(top).asActionResult } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpModifyInPlace.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpModifyInPlace.kt index f54ec91edb..f7be737c2d 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpModifyInPlace.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpModifyInPlace.kt @@ -1,6 +1,5 @@ package at.petrak.hexcasting.common.casting.actions.lists -import at.petrak.hexcasting.api.casting.SpellList import at.petrak.hexcasting.api.casting.asActionResult import at.petrak.hexcasting.api.casting.castables.ConstMediaAction import at.petrak.hexcasting.api.casting.eval.CastingEnvironment @@ -12,8 +11,8 @@ object OpModifyInPlace : ConstMediaAction { override val argc = 3 override fun execute(args: List, env: CastingEnvironment): List { val list = args.getList(0, argc) - val index = args.getPositiveIntUnder(1, list.size(), argc) + val index = args.getPositiveIntUnder(1, list.size, argc) val iota = args[2] - return list.modifyAt(index) { SpellList.LPair(iota, it.cdr) }.asActionResult + return list.updated(index, iota).asActionResult } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpUnCons.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpUnCons.kt index 211e91283d..a272f05d9f 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpUnCons.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpUnCons.kt @@ -11,8 +11,8 @@ object OpUnCons : ConstMediaAction { override val argc = 1 override fun execute(args: List, env: CastingEnvironment): List { val list = args.getList(0, argc) - if (list.nonEmpty) { - return listOf(ListIota(list.cdr), list.car) + if (!list.isEmpty()) { + return listOf(ListIota(list.tail()), list.head()) } return listOf(args[0], NullIota()) } 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 35a34e61ec..0f0953326f 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 @@ -1,6 +1,5 @@ package at.petrak.hexcasting.common.casting.arithmetic -import at.petrak.hexcasting.api.casting.SpellList 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 @@ -46,12 +45,12 @@ object ListArithmetic : Arithmetic { APPEND -> OperatorAppend UNAPPEND -> OperatorUnappend ADD -> make2 { list0, list1 -> list0 + list1 } - ABS -> OperatorUnary(all(IotaPredicate.ofType(LIST))) { iota: Iota -> DoubleIota(downcast(iota, LIST).list.size().toDouble()) } + ABS -> OperatorUnary(all(IotaPredicate.ofType(LIST))) { iota: Iota -> DoubleIota(downcast(iota, LIST).list.size.toDouble()) } REV -> OperatorUnary(all(IotaPredicate.ofType(LIST))) { iota: Iota -> ListIota(downcast(iota, LIST).list.toList().asReversed()) } INDEX_OF -> OperatorIndexOf REMOVE -> OperatorRemove REPLACE -> OperatorReplace - CONS -> OperatorBinary(pair(IotaPredicate.ofType(LIST), IotaPredicate.TRUE)) { list, iota -> ListIota(SpellList.LPair(iota, downcast(list, LIST).list)) } + CONS -> OperatorBinary(pair(IotaPredicate.ofType(LIST), IotaPredicate.TRUE)) { list, iota -> ListIota(downcast(list, LIST).list.prepended(iota)) } UNCONS -> OperatorUnCons else -> throw InvalidOperatorException("$pattern is not a valid operator in Arithmetic $this.") } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/OperatorUtils.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/OperatorUtils.kt index 24247286c8..00f71e831b 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/OperatorUtils.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/arithmetic/operator/OperatorUtils.kt @@ -1,14 +1,14 @@ package at.petrak.hexcasting.common.casting.arithmetic.operator -import at.petrak.hexcasting.api.casting.SpellList import at.petrak.hexcasting.api.casting.iota.DoubleIota import at.petrak.hexcasting.api.casting.iota.Iota import at.petrak.hexcasting.api.casting.iota.ListIota import at.petrak.hexcasting.api.casting.mishaps.MishapInvalidIota +import at.petrak.hexcasting.api.utils.TreeList import kotlin.math.abs import kotlin.math.roundToInt -fun Iterator>.nextList(argc: Int = 0): SpellList { +fun Iterator>.nextList(argc: Int = 0): TreeList { val (idx, x) = this.next() if (x is ListIota) { return x.list 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 ca976369c2..39abe2caee 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 @@ -1,7 +1,5 @@ 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 @@ -16,8 +14,8 @@ object OperatorReplace : OperatorBasic(3, IotaMultiPredicate.triple(IotaPredicat override fun apply(iotas: Iterable, env: CastingEnvironment): Iterable { val it = iotas.iterator().withIndex() val list = it.nextList(arity) - val index = it.nextPositiveIntUnder(list.size(), arity) + val index = it.nextPositiveIntUnder(list.size, arity) val iota = it.next().value - return list.modifyAt(index) { SpellList.LPair(iota, it.cdr) }.asActionResult + return list.updated(index, iota).asActionResult } } \ No newline at end of file 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 54f0de69c2..0ba55ecb9b 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,5 @@ 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 @@ -15,8 +14,8 @@ object OperatorUnCons : OperatorBasic(1, IotaMultiPredicate.all(IotaPredicate.of override fun apply(iotas: Iterable, env: CastingEnvironment): Iterable { val it = iotas.iterator().withIndex() val list = it.nextList(arity) - if (list.nonEmpty) - return listOf(ListIota(list.cdr), list.car) + if (!list.isEmpty()) + return listOf(ListIota(list.tail()), list.head()) return listOf(ListIota(list), NullIota()) } } \ No newline at end of file