partway through getting a bunch of list stuff converted to Operators.
This commit is contained in:
parent
e67c61a23e
commit
07cc518719
21 changed files with 255 additions and 64 deletions
|
@ -26,8 +26,12 @@ public interface Arithmetic {
|
||||||
// Lists
|
// Lists
|
||||||
HexPattern INDEX = HexPattern.fromAngles("deeed", HexDir.NORTH_WEST);
|
HexPattern INDEX = HexPattern.fromAngles("deeed", HexDir.NORTH_WEST);
|
||||||
HexPattern SLICE = HexPattern.fromAngles("qaeaqwded", HexDir.NORTH_WEST);
|
HexPattern SLICE = HexPattern.fromAngles("qaeaqwded", HexDir.NORTH_WEST);
|
||||||
|
HexPattern APPEND = HexPattern.fromAngles("edqde", HexDir.SOUTH_WEST);
|
||||||
|
HexPattern UNAPPEND = HexPattern.fromAngles("qaeaq", HexDir.NORTH_WEST);
|
||||||
HexPattern REV = HexPattern.fromAngles("qqqaede", HexDir.EAST);
|
HexPattern REV = HexPattern.fromAngles("qqqaede", HexDir.EAST);
|
||||||
HexPattern INDEX_OF = HexPattern.fromAngles("dedqde", HexDir.EAST);
|
HexPattern INDEX_OF = HexPattern.fromAngles("dedqde", HexDir.EAST);
|
||||||
HexPattern REMOVE = HexPattern.fromAngles("edqdewaqa", HexDir.SOUTH_WEST);
|
HexPattern REMOVE = HexPattern.fromAngles("edqdewaqa", HexDir.SOUTH_WEST);
|
||||||
HexPattern REPLACE = HexPattern.fromAngles("wqaeaqw", HexDir.NORTH_WEST);
|
HexPattern REPLACE = HexPattern.fromAngles("wqaeaqw", HexDir.NORTH_WEST);
|
||||||
|
HexPattern CONS = HexPattern.fromAngles("ddewedd", HexDir.SOUTH_EAST);
|
||||||
|
HexPattern UNCONS = HexPattern.fromAngles("aaqwqaa", HexDir.SOUTH_WEST);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,37 +0,0 @@
|
||||||
package at.petrak.hexcasting.api.casting.arithmetic.impls;
|
|
||||||
|
|
||||||
import at.petrak.hexcasting.api.casting.arithmetic.Arithmetic;
|
|
||||||
import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator;
|
|
||||||
import at.petrak.hexcasting.api.casting.math.HexPattern;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public enum ListArithmetic implements Arithmetic {
|
|
||||||
INSTANCE;
|
|
||||||
|
|
||||||
public static final List<HexPattern> OPS = List.of(
|
|
||||||
INDEX,
|
|
||||||
SLICE,
|
|
||||||
ADD,
|
|
||||||
ABS,
|
|
||||||
REV,
|
|
||||||
INDEX_OF,
|
|
||||||
REMOVE,
|
|
||||||
REPLACE
|
|
||||||
);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String arithName() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Iterable<HexPattern> opTypes() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Operator getOperator(HexPattern pattern) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,6 +1,6 @@
|
||||||
package at.petrak.hexcasting.api.casting.arithmetic.operator;
|
package at.petrak.hexcasting.api.casting.arithmetic.operator;
|
||||||
|
|
||||||
import at.petrak.hexcasting.api.casting.arithmetic.IotaMultiPredicate;
|
import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaMultiPredicate;
|
||||||
import at.petrak.hexcasting.api.casting.iota.Iota;
|
import at.petrak.hexcasting.api.casting.iota.Iota;
|
||||||
import at.petrak.hexcasting.api.casting.iota.IotaType;
|
import at.petrak.hexcasting.api.casting.iota.IotaType;
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package at.petrak.hexcasting.api.casting.arithmetic.operator;
|
package at.petrak.hexcasting.api.casting.arithmetic.operator;
|
||||||
|
|
||||||
|
|
||||||
import at.petrak.hexcasting.api.casting.arithmetic.IotaMultiPredicate;
|
import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaMultiPredicate;
|
||||||
import at.petrak.hexcasting.api.casting.iota.Iota;
|
import at.petrak.hexcasting.api.casting.iota.Iota;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package at.petrak.hexcasting.api.casting.arithmetic.operator;
|
package at.petrak.hexcasting.api.casting.arithmetic.operator;
|
||||||
|
|
||||||
|
|
||||||
import at.petrak.hexcasting.api.casting.arithmetic.IotaMultiPredicate;
|
import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaMultiPredicate;
|
||||||
import at.petrak.hexcasting.api.casting.iota.Iota;
|
import at.petrak.hexcasting.api.casting.iota.Iota;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package at.petrak.hexcasting.api.casting.arithmetic;
|
package at.petrak.hexcasting.api.casting.arithmetic.predicates;
|
||||||
|
|
||||||
import at.petrak.hexcasting.api.casting.iota.Iota;
|
import at.petrak.hexcasting.api.casting.iota.Iota;
|
||||||
|
|
||||||
|
@ -9,19 +9,29 @@ public interface IotaMultiPredicate {
|
||||||
static IotaMultiPredicate all(IotaPredicate child) {
|
static IotaMultiPredicate all(IotaPredicate child) {
|
||||||
return new All(child);
|
return new All(child);
|
||||||
}
|
}
|
||||||
static IotaMultiPredicate bofa(IotaPredicate first, IotaPredicate second) {
|
static IotaMultiPredicate pair(IotaPredicate first, IotaPredicate second) {
|
||||||
return new Any(first, second);
|
return new Pair(first, second);
|
||||||
|
}
|
||||||
|
static IotaMultiPredicate triple(IotaPredicate first, IotaPredicate second, IotaPredicate third) {
|
||||||
|
return new Triple(first, second, third);
|
||||||
}
|
}
|
||||||
static IotaMultiPredicate any(IotaPredicate needs, IotaPredicate fallback) {
|
static IotaMultiPredicate any(IotaPredicate needs, IotaPredicate fallback) {
|
||||||
return new Any(needs, fallback);
|
return new Any(needs, fallback);
|
||||||
}
|
}
|
||||||
record Bofa(IotaPredicate first, IotaPredicate second) implements IotaMultiPredicate {
|
record Pair(IotaPredicate first, IotaPredicate second) implements IotaMultiPredicate {
|
||||||
@Override
|
@Override
|
||||||
public boolean test(Iterable<Iota> iotas) {
|
public boolean test(Iterable<Iota> iotas) {
|
||||||
var it = iotas.iterator();
|
var it = iotas.iterator();
|
||||||
return it.hasNext() && first.test(it.next()) && it.hasNext() && second.test(it.next()) && !it.hasNext();
|
return it.hasNext() && first.test(it.next()) && it.hasNext() && second.test(it.next()) && !it.hasNext();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
record Triple(IotaPredicate first, IotaPredicate second, IotaPredicate third) implements IotaMultiPredicate {
|
||||||
|
@Override
|
||||||
|
public boolean test(Iterable<Iota> iotas) {
|
||||||
|
var it = iotas.iterator();
|
||||||
|
return it.hasNext() && first.test(it.next()) && it.hasNext() && second.test(it.next()) && it.hasNext() && third.test(it.next()) && !it.hasNext();
|
||||||
|
}
|
||||||
|
}
|
||||||
record Any(IotaPredicate needs, IotaPredicate fallback) implements IotaMultiPredicate {
|
record Any(IotaPredicate needs, IotaPredicate fallback) implements IotaMultiPredicate {
|
||||||
@Override
|
@Override
|
||||||
public boolean test(Iterable<Iota> iotas) {
|
public boolean test(Iterable<Iota> iotas) {
|
|
@ -1,4 +1,4 @@
|
||||||
package at.petrak.hexcasting.api.casting.arithmetic;
|
package at.petrak.hexcasting.api.casting.arithmetic.predicates;
|
||||||
|
|
||||||
import at.petrak.hexcasting.api.casting.iota.Iota;
|
import at.petrak.hexcasting.api.casting.iota.Iota;
|
||||||
import at.petrak.hexcasting.api.casting.iota.IotaType;
|
import at.petrak.hexcasting.api.casting.iota.IotaType;
|
||||||
|
@ -28,4 +28,6 @@ public interface IotaPredicate {
|
||||||
return iota.getType().equals(this.type);
|
return iota.getType().equals(this.type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IotaPredicate TRUE = iota -> true;
|
||||||
}
|
}
|
|
@ -1,8 +1,8 @@
|
||||||
package at.petrak.hexcasting.api.casting.arithmetic.impls;
|
package at.petrak.hexcasting.common.casting.arithmetic;
|
||||||
|
|
||||||
import at.petrak.hexcasting.api.casting.arithmetic.Arithmetic;
|
import at.petrak.hexcasting.api.casting.arithmetic.Arithmetic;
|
||||||
import at.petrak.hexcasting.api.casting.arithmetic.IotaMultiPredicate;
|
import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaMultiPredicate;
|
||||||
import at.petrak.hexcasting.api.casting.arithmetic.IotaPredicate;
|
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.Operator;
|
||||||
import at.petrak.hexcasting.api.casting.arithmetic.operator.OperatorBinary;
|
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.operator.OperatorUnary;
|
|
@ -0,0 +1,75 @@
|
||||||
|
package at.petrak.hexcasting.common.casting.arithmetic;
|
||||||
|
|
||||||
|
import at.petrak.hexcasting.api.casting.arithmetic.Arithmetic;
|
||||||
|
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.iota.DoubleIota;
|
||||||
|
import at.petrak.hexcasting.api.casting.iota.ListIota;
|
||||||
|
import at.petrak.hexcasting.common.casting.arithmetic.operator.list.*;
|
||||||
|
import at.petrak.hexcasting.api.casting.arithmetic.operator.OperatorUnary;
|
||||||
|
import at.petrak.hexcasting.api.casting.math.HexPattern;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static at.petrak.hexcasting.api.casting.arithmetic.operator.Operator.downcast;
|
||||||
|
import static at.petrak.hexcasting.common.lib.hex.HexIotaTypes.*;
|
||||||
|
|
||||||
|
public enum ListArithmetic implements Arithmetic {
|
||||||
|
INSTANCE;
|
||||||
|
|
||||||
|
public static final List<HexPattern> OPS = List.of(
|
||||||
|
INDEX,
|
||||||
|
SLICE,
|
||||||
|
APPEND,
|
||||||
|
UNAPPEND,
|
||||||
|
ADD,
|
||||||
|
ABS,
|
||||||
|
REV,
|
||||||
|
INDEX_OF,
|
||||||
|
REMOVE,
|
||||||
|
REPLACE,
|
||||||
|
CONS,
|
||||||
|
UNCONS
|
||||||
|
);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String arithName() {
|
||||||
|
return "list_ops";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<HexPattern> opTypes() {
|
||||||
|
return OPS;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Operator getOperator(HexPattern pattern) {
|
||||||
|
if (pattern.equals(INDEX)) {
|
||||||
|
return OperatorIndex.INSTANCE;
|
||||||
|
} else if (pattern.equals(SLICE)) {
|
||||||
|
return OperatorSlice.INSTANCE;
|
||||||
|
} else if (pattern.equals(APPEND)) {
|
||||||
|
return OperatorAppend.INSTANCE;
|
||||||
|
} else if (pattern.equals(UNAPPEND)) {
|
||||||
|
return OperatorUnappend.INSTANCE;
|
||||||
|
} else if (pattern.equals(ADD)) {
|
||||||
|
return OperatorConcat.INSTANCE;
|
||||||
|
} else if (pattern.equals(ABS)) {
|
||||||
|
return new OperatorUnary(IotaMultiPredicate.any(IotaPredicate.ofType(LIST), IotaPredicate.ofType(LIST)), iota -> new DoubleIota(downcast(iota, LIST).getList().size()));
|
||||||
|
} else if (pattern.equals(REV)) {
|
||||||
|
return new OperatorUnary(IotaMultiPredicate.any(IotaPredicate.ofType(LIST), IotaPredicate.ofType(LIST)), iota -> new ListIota(downcast(iota, LIST).getList()));
|
||||||
|
} else if (pattern.equals(INDEX_OF)) {
|
||||||
|
return new OperatorUnary(IotaMultiPredicate.any(IotaPredicate.ofType(LIST), IotaPredicate.ofType(LIST)), iota -> iota);
|
||||||
|
} else if (pattern.equals(REMOVE)) {
|
||||||
|
return new OperatorUnary(IotaMultiPredicate.any(IotaPredicate.ofType(LIST), IotaPredicate.ofType(LIST)), iota -> iota);
|
||||||
|
} else if (pattern.equals(REPLACE)) {
|
||||||
|
return new OperatorUnary(IotaMultiPredicate.any(IotaPredicate.ofType(LIST), IotaPredicate.ofType(LIST)), iota -> iota);
|
||||||
|
} else if (pattern.equals(CONS)) {
|
||||||
|
return new OperatorUnary(IotaMultiPredicate.any(IotaPredicate.ofType(LIST), IotaPredicate.ofType(LIST)), iota -> iota);
|
||||||
|
} else if (pattern.equals(UNCONS)) {
|
||||||
|
return new OperatorUnary(IotaMultiPredicate.any(IotaPredicate.ofType(LIST), IotaPredicate.ofType(LIST)), iota -> iota);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,12 +1,15 @@
|
||||||
package at.petrak.hexcasting.api.casting.arithmetic.impls;
|
package at.petrak.hexcasting.common.casting.arithmetic;
|
||||||
|
|
||||||
import at.petrak.hexcasting.api.casting.arithmetic.Arithmetic;
|
import at.petrak.hexcasting.api.casting.arithmetic.Arithmetic;
|
||||||
import at.petrak.hexcasting.api.casting.arithmetic.IotaMultiPredicate;
|
import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaMultiPredicate;
|
||||||
import at.petrak.hexcasting.api.casting.arithmetic.IotaPredicate;
|
import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaPredicate;
|
||||||
import at.petrak.hexcasting.api.casting.arithmetic.operator.*;
|
import at.petrak.hexcasting.api.casting.arithmetic.operator.*;
|
||||||
import at.petrak.hexcasting.api.casting.iota.DoubleIota;
|
import at.petrak.hexcasting.api.casting.iota.DoubleIota;
|
||||||
import at.petrak.hexcasting.api.casting.iota.Vec3Iota;
|
import at.petrak.hexcasting.api.casting.iota.Vec3Iota;
|
||||||
import at.petrak.hexcasting.api.casting.math.HexPattern;
|
import at.petrak.hexcasting.api.casting.math.HexPattern;
|
||||||
|
import at.petrak.hexcasting.common.casting.arithmetic.operator.vec.OperatorPack;
|
||||||
|
import at.petrak.hexcasting.common.casting.arithmetic.operator.vec.OperatorUnpack;
|
||||||
|
import at.petrak.hexcasting.common.casting.arithmetic.operator.vec.OperatorVec3Delegating;
|
||||||
import net.minecraft.world.phys.Vec3;
|
import net.minecraft.world.phys.Vec3;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
|
@ -0,0 +1,30 @@
|
||||||
|
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 kotlin.math.abs
|
||||||
|
import kotlin.math.roundToInt
|
||||||
|
|
||||||
|
fun Iterator<IndexedValue<Iota>>.nextList(argc: Int = 0): SpellList {
|
||||||
|
val (idx, x) = this.next()
|
||||||
|
if (x is ListIota) {
|
||||||
|
return x.list
|
||||||
|
} else {
|
||||||
|
throw MishapInvalidIota.ofType(x, if (argc == 0) idx else argc - (idx + 1), "list")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Iterator<IndexedValue<Iota>>.nextPositiveIntUnderInclusive(max: Int, argc: Int = 0): Int {
|
||||||
|
val (idx, x) = this.next()
|
||||||
|
if (x is DoubleIota) {
|
||||||
|
val double = x.double
|
||||||
|
val rounded = double.roundToInt()
|
||||||
|
if (abs(double - rounded) <= DoubleIota.TOLERANCE && rounded in 0..max) {
|
||||||
|
return rounded
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw MishapInvalidIota.of(x, if (argc == 0) idx else argc - (idx + 1), "int.positive.less.equal", max)
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
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.predicates.IotaMultiPredicate
|
||||||
|
import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaPredicate
|
||||||
|
import at.petrak.hexcasting.api.casting.asActionResult
|
||||||
|
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)) {
|
||||||
|
override fun apply(iotas: Iterable<Iota>): Iterable<Iota> {
|
||||||
|
val it = iotas.iterator().withIndex()
|
||||||
|
val list = it.nextList(arity).toMutableList()
|
||||||
|
list.add(it.next().value)
|
||||||
|
return list.asActionResult
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
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.predicates.IotaMultiPredicate
|
||||||
|
import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaPredicate
|
||||||
|
import at.petrak.hexcasting.api.casting.asActionResult
|
||||||
|
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 OperatorConcat : Operator(2, IotaMultiPredicate.all(IotaPredicate.ofType(LIST))) {
|
||||||
|
override fun apply(iotas: Iterable<Iota>): Iterable<Iota> {
|
||||||
|
val it = iotas.iterator().withIndex()
|
||||||
|
val lhs = it.nextList(arity).toMutableList()
|
||||||
|
val rhs = it.nextList(arity)
|
||||||
|
lhs.addAll(rhs)
|
||||||
|
return lhs.asActionResult
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
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.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))) {
|
||||||
|
override fun apply(iotas: Iterable<Iota>): Iterable<Iota> {
|
||||||
|
val it = iotas.iterator()
|
||||||
|
val list = downcast(it.next(), LIST).list.toMutableList()
|
||||||
|
val index = downcast(it.next(), DOUBLE).double
|
||||||
|
val x = list.getOrElse(index.roundToInt()) { NullIota() }
|
||||||
|
return listOf(x)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
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.asActionResult
|
||||||
|
import at.petrak.hexcasting.api.casting.iota.Iota
|
||||||
|
import at.petrak.hexcasting.common.casting.arithmetic.operator.nextList
|
||||||
|
import at.petrak.hexcasting.common.casting.arithmetic.operator.nextPositiveIntUnderInclusive
|
||||||
|
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))) {
|
||||||
|
override fun apply(iotas: Iterable<Iota>): Iterable<Iota> {
|
||||||
|
val it = iotas.iterator().withIndex()
|
||||||
|
val list = it.nextList(arity).toList()
|
||||||
|
val index0 = it.nextPositiveIntUnderInclusive(list.size, arity)
|
||||||
|
val index1 = it.nextPositiveIntUnderInclusive(list.size, arity)
|
||||||
|
|
||||||
|
if (index0 == index1)
|
||||||
|
return emptyList<Iota>().asActionResult
|
||||||
|
return list.subList(min(index0, index1), max(index0, index1)).asActionResult
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
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.predicates.IotaMultiPredicate
|
||||||
|
import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaPredicate
|
||||||
|
import at.petrak.hexcasting.api.casting.iota.Iota
|
||||||
|
import at.petrak.hexcasting.api.casting.iota.ListIota
|
||||||
|
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))) {
|
||||||
|
override fun apply(iotas: Iterable<Iota>): Iterable<Iota> {
|
||||||
|
val it = iotas.iterator().withIndex()
|
||||||
|
val list = it.nextList(arity).toMutableList()
|
||||||
|
val last = list.removeLastOrNull() ?: NullIota()
|
||||||
|
return listOf(ListIota(list), last)
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,8 +1,9 @@
|
||||||
package at.petrak.hexcasting.api.casting.arithmetic.operator;
|
package at.petrak.hexcasting.common.casting.arithmetic.operator.vec;
|
||||||
|
|
||||||
|
|
||||||
import at.petrak.hexcasting.api.casting.arithmetic.IotaMultiPredicate;
|
import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaMultiPredicate;
|
||||||
import at.petrak.hexcasting.api.casting.arithmetic.IotaPredicate;
|
import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaPredicate;
|
||||||
|
import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator;
|
||||||
import at.petrak.hexcasting.api.casting.iota.Iota;
|
import at.petrak.hexcasting.api.casting.iota.Iota;
|
||||||
import at.petrak.hexcasting.api.casting.iota.Vec3Iota;
|
import at.petrak.hexcasting.api.casting.iota.Vec3Iota;
|
||||||
import at.petrak.hexcasting.common.lib.hex.HexIotaTypes;
|
import at.petrak.hexcasting.common.lib.hex.HexIotaTypes;
|
|
@ -1,8 +1,9 @@
|
||||||
package at.petrak.hexcasting.api.casting.arithmetic.operator;
|
package at.petrak.hexcasting.common.casting.arithmetic.operator.vec;
|
||||||
|
|
||||||
|
|
||||||
import at.petrak.hexcasting.api.casting.arithmetic.IotaMultiPredicate;
|
import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaMultiPredicate;
|
||||||
import at.petrak.hexcasting.api.casting.arithmetic.IotaPredicate;
|
import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaPredicate;
|
||||||
|
import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator;
|
||||||
import at.petrak.hexcasting.api.casting.iota.DoubleIota;
|
import at.petrak.hexcasting.api.casting.iota.DoubleIota;
|
||||||
import at.petrak.hexcasting.api.casting.iota.Iota;
|
import at.petrak.hexcasting.api.casting.iota.Iota;
|
||||||
import at.petrak.hexcasting.common.lib.hex.HexIotaTypes;
|
import at.petrak.hexcasting.common.lib.hex.HexIotaTypes;
|
|
@ -1,10 +1,11 @@
|
||||||
package at.petrak.hexcasting.api.casting.arithmetic.operator;
|
package at.petrak.hexcasting.common.casting.arithmetic.operator.vec;
|
||||||
|
|
||||||
import at.petrak.hexcasting.api.casting.arithmetic.IotaMultiPredicate;
|
import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaMultiPredicate;
|
||||||
import at.petrak.hexcasting.api.casting.arithmetic.IotaPredicate;
|
import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaPredicate;
|
||||||
import at.petrak.hexcasting.api.casting.arithmetic.IterPair;
|
import at.petrak.hexcasting.api.casting.arithmetic.IterPair;
|
||||||
import at.petrak.hexcasting.api.casting.arithmetic.TripleIterable;
|
import at.petrak.hexcasting.api.casting.arithmetic.TripleIterable;
|
||||||
import at.petrak.hexcasting.api.casting.arithmetic.impls.DoubleArithmetic;
|
import at.petrak.hexcasting.api.casting.arithmetic.operator.Operator;
|
||||||
|
import at.petrak.hexcasting.common.casting.arithmetic.DoubleArithmetic;
|
||||||
import at.petrak.hexcasting.api.casting.iota.DoubleIota;
|
import at.petrak.hexcasting.api.casting.iota.DoubleIota;
|
||||||
import at.petrak.hexcasting.api.casting.iota.Iota;
|
import at.petrak.hexcasting.api.casting.iota.Iota;
|
||||||
import at.petrak.hexcasting.api.casting.iota.Vec3Iota;
|
import at.petrak.hexcasting.api.casting.iota.Vec3Iota;
|
|
@ -1,11 +1,12 @@
|
||||||
package at.petrak.hexcasting.common.lib.hex;
|
package at.petrak.hexcasting.common.lib.hex;
|
||||||
|
|
||||||
import at.petrak.hexcasting.api.casting.arithmetic.engine.ArithmeticEngine;
|
import at.petrak.hexcasting.api.casting.arithmetic.engine.ArithmeticEngine;
|
||||||
import at.petrak.hexcasting.api.casting.arithmetic.impls.DoubleArithmetic;
|
import at.petrak.hexcasting.common.casting.arithmetic.DoubleArithmetic;
|
||||||
import at.petrak.hexcasting.api.casting.arithmetic.impls.Vec3Arithmetic;
|
import at.petrak.hexcasting.common.casting.arithmetic.ListArithmetic;
|
||||||
|
import at.petrak.hexcasting.common.casting.arithmetic.Vec3Arithmetic;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class HexArithmetics {
|
public class HexArithmetics {
|
||||||
public static ArithmeticEngine ENGINE = new ArithmeticEngine(List.of(DoubleArithmetic.INSTANCE, Vec3Arithmetic.INSTANCE));
|
public static ArithmeticEngine ENGINE = new ArithmeticEngine(List.of(DoubleArithmetic.INSTANCE, Vec3Arithmetic.INSTANCE, ListArithmetic.INSTANCE));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue