summaryrefslogtreecommitdiff
path: root/src/main/java/lv/enes/mc/eris_alchemy/utils
diff options
context:
space:
mode:
authorGravatar Uko Kokņevičs2024-01-13 01:12:12 +0100
committerGravatar Uko Kokņevičs2024-01-13 01:12:12 +0100
commitdc7613dd4669393a313b270b55cfaaa3ff8c94a3 (patch)
tree657c3aa3c185cd9c8820ff4a5a32336f5cf421c6 /src/main/java/lv/enes/mc/eris_alchemy/utils
parentBump versions (diff)
downloadmc-eris-alchemy-dc7613dd4669393a313b270b55cfaaa3ff8c94a3.tar.gz
mc-eris-alchemy-dc7613dd4669393a313b270b55cfaaa3ff8c94a3.tar.xz
mc-eris-alchemy-dc7613dd4669393a313b270b55cfaaa3ff8c94a3.zip
Toposort recipes so it's actually usably fast
Diffstat (limited to 'src/main/java/lv/enes/mc/eris_alchemy/utils')
-rw-r--r--src/main/java/lv/enes/mc/eris_alchemy/utils/ConsList.java103
-rw-r--r--src/main/java/lv/enes/mc/eris_alchemy/utils/IngredientProvider.java44
-rw-r--r--src/main/java/lv/enes/mc/eris_alchemy/utils/ItemUtils.java5
-rw-r--r--src/main/java/lv/enes/mc/eris_alchemy/utils/OptionalDoubleSummer.java47
-rw-r--r--src/main/java/lv/enes/mc/eris_alchemy/utils/Ref.java14
5 files changed, 213 insertions, 0 deletions
diff --git a/src/main/java/lv/enes/mc/eris_alchemy/utils/ConsList.java b/src/main/java/lv/enes/mc/eris_alchemy/utils/ConsList.java
new file mode 100644
index 0000000..bbab8a6
--- /dev/null
+++ b/src/main/java/lv/enes/mc/eris_alchemy/utils/ConsList.java
@@ -0,0 +1,103 @@
1package lv.enes.mc.eris_alchemy.utils;
2
3import jakarta.annotation.Nonnull;
4
5import java.util.Objects;
6import java.util.Optional;
7import java.util.function.Supplier;
8import java.util.stream.Stream;
9
10public sealed abstract class ConsList<E> {
11 public static <E> ConsList<E> cons(E car, ConsList<E> cdr) {
12 return new Cons<>(car, cdr);
13 }
14
15 public static <E> ConsList<E> nil() {
16 return Nil.of();
17 }
18
19 @Nonnull
20 public abstract Optional<E> car();
21
22 @Nonnull
23 public abstract ConsList<E> cdr();
24
25 public boolean contains(E elem) {
26 return stream().anyMatch(x -> Objects.equals(x, elem));
27 }
28
29 public Stream<E> stream() {
30 var car = car();
31 if (car.isEmpty()) {
32 return Stream.empty();
33 }
34
35 return Stream.<Supplier<Stream<E>>>of(
36 () -> Stream.of(car.get()),
37 () -> cdr().stream()
38 )
39 .flatMap(Supplier::get);
40 }
41
42 @Override
43 public String toString() {
44 if (car().isEmpty()) {
45 return "[]";
46 }
47
48 var sb = new StringBuilder("[");
49 sb.append(car().get());
50 stream().skip(1)
51 .forEach(x -> {
52 sb.append(" -> ");
53 sb.append(x);
54 });
55 sb.append("]");
56 return sb.toString();
57 }
58
59 private static final class Cons<E> extends ConsList<E> {
60 private final E car;
61 private final ConsList<E> cdr;
62
63 public Cons(E car, ConsList<E> cdr) {
64 this.car = car;
65 this.cdr = cdr;
66 }
67
68 @Nonnull
69 @Override
70 public Optional<E> car() {
71 return Optional.of(car);
72 }
73
74 @Nonnull
75 @Override
76 public ConsList<E> cdr() {
77 return cdr;
78 }
79 }
80
81 private static final class Nil<E> extends ConsList<E> {
82 private static final Nil<?> INSTANCE = new Nil<>();
83
84 @SuppressWarnings("unchecked")
85 public static <E> Nil<E> of() {
86 return (Nil<E>)INSTANCE;
87 }
88
89 private Nil(){}
90
91 @Nonnull
92 @Override
93 public Optional<E> car() {
94 return Optional.empty();
95 }
96
97 @Nonnull
98 @Override
99 public ConsList<E> cdr() {
100 return Nil.of();
101 }
102 }
103}
diff --git a/src/main/java/lv/enes/mc/eris_alchemy/utils/IngredientProvider.java b/src/main/java/lv/enes/mc/eris_alchemy/utils/IngredientProvider.java
new file mode 100644
index 0000000..e859114
--- /dev/null
+++ b/src/main/java/lv/enes/mc/eris_alchemy/utils/IngredientProvider.java
@@ -0,0 +1,44 @@
1package lv.enes.mc.eris_alchemy.utils;
2
3import com.google.gson.JsonDeserializationContext;
4import com.google.gson.JsonDeserializer;
5import com.google.gson.JsonElement;
6import com.google.gson.JsonParseException;
7import net.minecraft.core.registries.Registries;
8import net.minecraft.resources.ResourceLocation;
9import net.minecraft.tags.TagKey;
10import net.minecraft.world.item.crafting.Ingredient;
11import net.minecraft.world.item.crafting.ShapedRecipe;
12
13import java.lang.reflect.Type;
14import java.util.function.Supplier;
15
16public class IngredientProvider implements JsonDeserializer<Supplier<Ingredient>> {
17 public static Supplier<Ingredient> deserialize(JsonElement el) {
18 if (el.isJsonObject()) {
19 return () -> Ingredient.of(ShapedRecipe.itemStackFromJson(el.getAsJsonObject()));
20 } else if (el.isJsonPrimitive() && el.getAsJsonPrimitive().isString()) {
21 return deserialize(el.getAsString().strip());
22 } else {
23 throw new JsonParseException("Every ingredient should be an object or a string");
24 }
25 }
26
27 public static Supplier<Ingredient> deserialize(String str) {
28 if (str.startsWith("#")) {
29 var tag = TagKey.create(Registries.ITEM, new ResourceLocation(str.substring(1).strip()));
30 return () -> Ingredient.of(tag);
31 } else {
32 return () -> Ingredient.of(ItemUtils.get(new ResourceLocation(str)));
33 }
34 }
35
36 @Override
37 public Supplier<Ingredient> deserialize(
38 JsonElement el,
39 Type t,
40 JsonDeserializationContext c
41 ) {
42 return IngredientProvider.deserialize(el);
43 }
44}
diff --git a/src/main/java/lv/enes/mc/eris_alchemy/utils/ItemUtils.java b/src/main/java/lv/enes/mc/eris_alchemy/utils/ItemUtils.java
index 4414d06..7ac7358 100644
--- a/src/main/java/lv/enes/mc/eris_alchemy/utils/ItemUtils.java
+++ b/src/main/java/lv/enes/mc/eris_alchemy/utils/ItemUtils.java
@@ -3,10 +3,15 @@ package lv.enes.mc.eris_alchemy.utils;
3import net.minecraft.core.Holder; 3import net.minecraft.core.Holder;
4import net.minecraft.core.registries.BuiltInRegistries; 4import net.minecraft.core.registries.BuiltInRegistries;
5import net.minecraft.resources.ResourceLocation; 5import net.minecraft.resources.ResourceLocation;
6import net.minecraft.world.item.Item;
6import net.minecraft.world.item.ItemStack; 7import net.minecraft.world.item.ItemStack;
7import net.minecraft.world.level.ItemLike; 8import net.minecraft.world.level.ItemLike;
8 9
9public final class ItemUtils { 10public final class ItemUtils {
11 public static Item get(ResourceLocation id) {
12 return BuiltInRegistries.ITEM.get(id);
13 }
14
10 public static <I extends ItemLike> ResourceLocation getId(Holder<I> holder) { 15 public static <I extends ItemLike> ResourceLocation getId(Holder<I> holder) {
11 return getId(holder.value()); 16 return getId(holder.value());
12 } 17 }
diff --git a/src/main/java/lv/enes/mc/eris_alchemy/utils/OptionalDoubleSummer.java b/src/main/java/lv/enes/mc/eris_alchemy/utils/OptionalDoubleSummer.java
new file mode 100644
index 0000000..04b6ca8
--- /dev/null
+++ b/src/main/java/lv/enes/mc/eris_alchemy/utils/OptionalDoubleSummer.java
@@ -0,0 +1,47 @@
1package lv.enes.mc.eris_alchemy.utils;
2
3import java.util.OptionalDouble;
4import java.util.Set;
5import java.util.function.BiConsumer;
6import java.util.function.BinaryOperator;
7import java.util.function.Function;
8import java.util.function.Supplier;
9import java.util.stream.Collector;
10
11public class OptionalDoubleSummer implements Collector<OptionalDouble, Ref<OptionalDouble>, OptionalDouble> {
12 @Override
13 public Supplier<Ref<OptionalDouble>> supplier() {
14 return () -> new Ref<>(OptionalDouble.of(0));
15 }
16
17 @Override
18 public BiConsumer<Ref<OptionalDouble>, OptionalDouble> accumulator() {
19 return (ref, od) -> {
20 if (ref.getValue().isPresent()) {
21 if (od.isPresent()) {
22 ref.setValue(OptionalDouble.of(ref.getValue().getAsDouble() + od.getAsDouble()));
23 } else {
24 ref.setValue(OptionalDouble.empty());
25 }
26 }
27 };
28 }
29
30 @Override
31 public BinaryOperator<Ref<OptionalDouble>> combiner() {
32 return (ref1, ref2) -> {
33 accumulator().accept(ref1, ref2.getValue());
34 return ref1;
35 };
36 }
37
38 @Override
39 public Function<Ref<OptionalDouble>, OptionalDouble> finisher() {
40 return Ref::getValue;
41 }
42
43 @Override
44 public Set<Characteristics> characteristics() {
45 return Set.of(Characteristics.UNORDERED);
46 }
47}
diff --git a/src/main/java/lv/enes/mc/eris_alchemy/utils/Ref.java b/src/main/java/lv/enes/mc/eris_alchemy/utils/Ref.java
new file mode 100644
index 0000000..dc2624a
--- /dev/null
+++ b/src/main/java/lv/enes/mc/eris_alchemy/utils/Ref.java
@@ -0,0 +1,14 @@
1package lv.enes.mc.eris_alchemy.utils;
2
3import lombok.Getter;
4import lombok.Setter;
5
6@Setter
7@Getter
8public class Ref<T> {
9 private T value;
10
11 public Ref(T value) {
12 this.value = value;
13 }
14}