diff options
Diffstat (limited to 'src/main/java/lv/enes/mc/eris_alchemy/utils')
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 @@ | |||
| 1 | package lv.enes.mc.eris_alchemy.utils; | ||
| 2 | |||
| 3 | import jakarta.annotation.Nonnull; | ||
| 4 | |||
| 5 | import java.util.Objects; | ||
| 6 | import java.util.Optional; | ||
| 7 | import java.util.function.Supplier; | ||
| 8 | import java.util.stream.Stream; | ||
| 9 | |||
| 10 | public 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 @@ | |||
| 1 | package lv.enes.mc.eris_alchemy.utils; | ||
| 2 | |||
| 3 | import com.google.gson.JsonDeserializationContext; | ||
| 4 | import com.google.gson.JsonDeserializer; | ||
| 5 | import com.google.gson.JsonElement; | ||
| 6 | import com.google.gson.JsonParseException; | ||
| 7 | import net.minecraft.core.registries.Registries; | ||
| 8 | import net.minecraft.resources.ResourceLocation; | ||
| 9 | import net.minecraft.tags.TagKey; | ||
| 10 | import net.minecraft.world.item.crafting.Ingredient; | ||
| 11 | import net.minecraft.world.item.crafting.ShapedRecipe; | ||
| 12 | |||
| 13 | import java.lang.reflect.Type; | ||
| 14 | import java.util.function.Supplier; | ||
| 15 | |||
| 16 | public 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; | |||
| 3 | import net.minecraft.core.Holder; | 3 | import net.minecraft.core.Holder; |
| 4 | import net.minecraft.core.registries.BuiltInRegistries; | 4 | import net.minecraft.core.registries.BuiltInRegistries; |
| 5 | import net.minecraft.resources.ResourceLocation; | 5 | import net.minecraft.resources.ResourceLocation; |
| 6 | import net.minecraft.world.item.Item; | ||
| 6 | import net.minecraft.world.item.ItemStack; | 7 | import net.minecraft.world.item.ItemStack; |
| 7 | import net.minecraft.world.level.ItemLike; | 8 | import net.minecraft.world.level.ItemLike; |
| 8 | 9 | ||
| 9 | public final class ItemUtils { | 10 | public 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 @@ | |||
| 1 | package lv.enes.mc.eris_alchemy.utils; | ||
| 2 | |||
| 3 | import java.util.OptionalDouble; | ||
| 4 | import java.util.Set; | ||
| 5 | import java.util.function.BiConsumer; | ||
| 6 | import java.util.function.BinaryOperator; | ||
| 7 | import java.util.function.Function; | ||
| 8 | import java.util.function.Supplier; | ||
| 9 | import java.util.stream.Collector; | ||
| 10 | |||
| 11 | public 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 @@ | |||
| 1 | package lv.enes.mc.eris_alchemy.utils; | ||
| 2 | |||
| 3 | import lombok.Getter; | ||
| 4 | import lombok.Setter; | ||
| 5 | |||
| 6 | @Setter | ||
| 7 | @Getter | ||
| 8 | public class Ref<T> { | ||
| 9 | private T value; | ||
| 10 | |||
| 11 | public Ref(T value) { | ||
| 12 | this.value = value; | ||
| 13 | } | ||
| 14 | } | ||