From f8f940fefa74417d77f864781cb5e5047903b61c Mon Sep 17 00:00:00 2001 From: Aly Date: Sun, 10 May 2026 13:39:14 -0600 Subject: [PATCH 1/2] move all ops to use TreeList --- .../hexcasting/common/casting/actions/lists/OpAppend.kt | 5 ++--- .../hexcasting/common/casting/actions/lists/OpConcat.kt | 5 ++--- .../hexcasting/common/casting/actions/lists/OpIndex.kt | 2 +- .../hexcasting/common/casting/actions/lists/OpIndexOf.kt | 2 +- .../hexcasting/common/casting/actions/lists/OpListSize.kt | 2 +- .../hexcasting/common/casting/actions/lists/OpRemove.kt | 6 +++--- .../hexcasting/common/casting/actions/lists/OpReverski.kt | 2 +- .../hexcasting/common/casting/actions/lists/OpSlice.kt | 2 +- .../hexcasting/common/casting/actions/lists/OpSplat.kt | 2 +- .../common/casting/actions/spells/OpMakePackagedSpell.kt | 2 +- .../hexcasting/common/casting/arithmetic/ListArithmetic.kt | 4 ++-- .../common/casting/arithmetic/ListSetArithmetic.kt | 2 +- .../casting/arithmetic/operator/list/OperatorAppend.kt | 5 ++--- .../casting/arithmetic/operator/list/OperatorIndex.kt | 2 +- .../casting/arithmetic/operator/list/OperatorIndexOf.kt | 2 +- .../casting/arithmetic/operator/list/OperatorRemove.kt | 6 +++--- .../casting/arithmetic/operator/list/OperatorSlice.kt | 4 ++-- .../casting/arithmetic/operator/list/OperatorUnappend.kt | 6 +++--- 18 files changed, 29 insertions(+), 32 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpAppend.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpAppend.kt index 1834166ee2..1d788f9b4a 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpAppend.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpAppend.kt @@ -9,9 +9,8 @@ import at.petrak.hexcasting.api.casting.iota.Iota object OpAppend : ConstMediaAction { override val argc = 2 override fun execute(args: List, env: CastingEnvironment): List { - val list = args.getList(0, argc).toMutableList() + val list = args.getList(0, argc) val datum = args[1] - list.add(datum) - return list.asActionResult + return list.appended(datum).asActionResult } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpConcat.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpConcat.kt index 2e77b35673..63bbd62f33 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpConcat.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpConcat.kt @@ -9,9 +9,8 @@ import at.petrak.hexcasting.api.casting.iota.Iota object OpConcat : ConstMediaAction { override val argc = 2 override fun execute(args: List, env: CastingEnvironment): List { - val lhs = args.getList(0, argc).toMutableList() + val lhs = args.getList(0, argc) val rhs = args.getList(1, argc) - lhs.addAll(rhs) - return lhs.asActionResult + return lhs.appendedAll(rhs).asActionResult } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpIndex.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpIndex.kt index dacaa022a8..d7b4e6477d 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpIndex.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpIndex.kt @@ -11,7 +11,7 @@ import kotlin.math.roundToInt object OpIndex : ConstMediaAction { override val argc = 2 override fun execute(args: List, env: CastingEnvironment): List { - val list = args.getList(0, argc).toMutableList() + val list = args.getList(0, argc) val index = args.getDouble(1, argc) val x = list.getOrElse(index.roundToInt()) { NullIota() } return listOf(x) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpIndexOf.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpIndexOf.kt index 98209c9b08..22e1bee7dc 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpIndexOf.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpIndexOf.kt @@ -11,7 +11,7 @@ object OpIndexOf : ConstMediaAction { get() = 2 override fun execute(args: List, env: CastingEnvironment): List { - val list = args.getList(0, argc).toMutableList() + val list = args.getList(0, argc) val value = args[1] return list.indexOfFirst { Iota.tolerates(value, it) }.asActionResult } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpListSize.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpListSize.kt index 0df98e1653..122fb72db8 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpListSize.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpListSize.kt @@ -10,6 +10,6 @@ import at.petrak.hexcasting.api.casting.iota.Iota object OpListSize : ConstMediaAction { override val argc = 1 override fun execute(args: List, env: CastingEnvironment): List { - return args.getList(0, argc).toList().size.asActionResult // mmm one-liner + return args.getList(0, argc).size.asActionResult // mmm one-liner } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpRemove.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpRemove.kt index 586b679eb0..073c5b9600 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpRemove.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpRemove.kt @@ -12,11 +12,11 @@ object OpRemove : ConstMediaAction { get() = 2 override fun execute(args: List, env: CastingEnvironment): List { - val list = args.getList(0, argc).toMutableList() + val list = args.getList(0, argc) val index = args.getInt(1, argc) if (index < 0 || index >= list.size) return list.asActionResult - list.removeAt(index) - return list.asActionResult + + return list.take(index).appendedAll(list.drop(index + 1)).asActionResult } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpReverski.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpReverski.kt index ffee540359..c2ca437b0c 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpReverski.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpReverski.kt @@ -9,6 +9,6 @@ import at.petrak.hexcasting.api.casting.iota.Iota object OpReverski : ConstMediaAction { override val argc = 1 override fun execute(args: List, env: CastingEnvironment): List { - return args.getList(0, argc).toList().asReversed().asActionResult // okay kotlin kinda pogged for this + return args.getList(0, argc).reversed().asActionResult } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpSlice.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpSlice.kt index f83daf7614..2d849722fe 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpSlice.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpSlice.kt @@ -12,7 +12,7 @@ import kotlin.math.min object OpSlice : ConstMediaAction { override val argc = 3 override fun execute(args: List, env: CastingEnvironment): List { - val list = args.getList(0, argc).toList() + val list = args.getList(0, argc) val index1 = args.getPositiveIntUnderInclusive(1, list.size, argc) val index2 = args.getPositiveIntUnderInclusive(2, list.size, argc) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpSplat.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpSplat.kt index f35f0d8ac3..cf46c476c6 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpSplat.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpSplat.kt @@ -10,5 +10,5 @@ object OpSplat : ConstMediaAction { get() = 1 override fun execute(args: List, env: CastingEnvironment): List = - args.getList(0, argc).toList() + args.getList(0, argc) } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpMakePackagedSpell.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpMakePackagedSpell.kt index 57ad808dbf..7c50fdb150 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpMakePackagedSpell.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpMakePackagedSpell.kt @@ -31,7 +31,7 @@ class OpMakePackagedSpell(val isValid: Predicate, val expectedTypeDes env: CastingEnvironment ): SpellAction.Result { val entity = args.getItemEntity(env.world, 0, argc) - val patterns = args.getList(1, argc).toList() + val patterns = args.getList(1, argc) val (handStack) = env.getHeldItemToOperateOn { val hexHolder = IXplatAbstractions.INSTANCE.findHexHolder(it) 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 0f0953326f..948be6908c 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 @@ -46,7 +46,7 @@ object ListArithmetic : Arithmetic { UNAPPEND -> OperatorUnappend ADD -> make2 { list0, list1 -> list0 + list1 } 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()) } + REV -> OperatorUnary(all(IotaPredicate.ofType(LIST))) { iota: Iota -> ListIota(downcast(iota, LIST).list.reversed()) } INDEX_OF -> OperatorIndexOf REMOVE -> OperatorRemove REPLACE -> OperatorReplace @@ -58,6 +58,6 @@ object ListArithmetic : Arithmetic { private fun make2(op: BinaryOperator>): OperatorBinary = OperatorBinary(all(IotaPredicate.ofType(LIST))) { i: Iota, j: Iota -> ListIota( - op.apply(downcast(i, LIST).list.toList(), downcast(j, LIST).list.toList()) + op.apply(downcast(i, LIST).list, downcast(j, LIST).list) ) } } 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 b0096eb1d8..4a7637f5ac 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 @@ -38,6 +38,6 @@ object ListSetArithmetic : Arithmetic { private fun make2(op: BinaryOperator>): OperatorBinary = OperatorBinary(all(IotaPredicate.ofType(LIST))) { i: Iota, j: Iota -> ListIota( - op.apply(downcast(i, LIST).list.toList(), downcast(j, LIST).list.toList()) + op.apply(downcast(i, LIST).list, downcast(j, LIST).list) ) } } \ No newline at end of file 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 7e88dc0cb1..4879a7b661 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 @@ -12,8 +12,7 @@ import at.petrak.hexcasting.common.lib.hex.HexIotaTypes.LIST 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() - list.add(it.next().value) - return list.asActionResult + val list = it.nextList(arity) + return list.appended(it.next().value).asActionResult } } \ No newline at end of file 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 502a680d3a..7dc74c7f1d 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 @@ -13,7 +13,7 @@ import kotlin.math.roundToInt 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() + val list = downcast(it.next(), LIST).list val index = downcast(it.next(), DOUBLE).double val x = list.getOrElse(index.roundToInt()) { NullIota() } return listOf(x) 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 747b4f74a2..7d53a84745 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 @@ -12,7 +12,7 @@ import at.petrak.hexcasting.common.lib.hex.HexIotaTypes.LIST 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() + val list = it.nextList(arity) val toFind = it.next().value return list.indexOfFirst { Iota.tolerates(toFind, it) }.asActionResult } 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 685911c175..fb87afca86 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 @@ -14,11 +14,11 @@ import at.petrak.hexcasting.common.lib.hex.HexIotaTypes.LIST 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() + val list = it.nextList(arity) val index = it.nextInt(arity) if (index < 0 || index >= list.size) return list.asActionResult - list.removeAt(index) - return list.asActionResult + + return list.take(index).appendedAll(list.drop(index + 1)).asActionResult } } \ No newline at end of file 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 b62b4435fe..5476a74660 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 @@ -16,12 +16,12 @@ import kotlin.math.min 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() + val list = it.nextList(arity) val index0 = it.nextPositiveIntUnderInclusive(list.size, arity) val index1 = it.nextPositiveIntUnderInclusive(list.size, arity) if (index0 == index1) return emptyList().asActionResult - return list.subList(min(index0, index1), max(index0, index1)).asActionResult + return list.slice(min(index0, index1), max(index0, index1)).asActionResult } } \ No newline at end of file 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 6203dd1748..44d6228945 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 @@ -13,8 +13,8 @@ import at.petrak.hexcasting.common.lib.hex.HexIotaTypes.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() - val last = list.removeLastOrNull() ?: NullIota() - return listOf(ListIota(list), last) + val list = it.nextList(arity) + val last = if(list.isEmpty()) NullIota() else list.last() + return listOf(ListIota(list.init()), last) } } \ No newline at end of file From 5bdf28a0d07be0699bccfaac003efc39e5d96517 Mon Sep 17 00:00:00 2001 From: Aly Date: Thu, 11 Jun 2026 20:01:21 -0600 Subject: [PATCH 2/2] add changelog entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a88d65fb9..dde33ed217 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). - ListIota now uses the asymptotically-efficient TreeList internally ([#1032](https://github.com/FallingColors/HexMod/pull/1032)) @s5bug - SpellList has been removed ([#1032](https://github.com/FallingColors/HexMod/pull/1032)) @s5bug - Casting Image and Casting Frames now store iotas in a TreeList ([#1033](https://github.com/FallingColors/HexMod/pull/1033)) @s5bug +- Operations and actions now accept the old stack and produce the new stack through a TreeList ([#1038](https://github.com/FallingColors/HexMod/pull/1038)) @s5bug ## `0.11.3` - 2025-11-22