From dc7613dd4669393a313b270b55cfaaa3ff8c94a3 Mon Sep 17 00:00:00 2001 From: Uko Kokņevičs Date: Sat, 13 Jan 2024 01:12:12 +0100 Subject: Toposort recipes so it's actually usably fast --- .../eris_alchemy/utils/OptionalDoubleSummer.java | 47 ++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/main/java/lv/enes/mc/eris_alchemy/utils/OptionalDoubleSummer.java (limited to 'src/main/java/lv/enes/mc/eris_alchemy/utils/OptionalDoubleSummer.java') 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 @@ +package lv.enes.mc.eris_alchemy.utils; + +import java.util.OptionalDouble; +import java.util.Set; +import java.util.function.BiConsumer; +import java.util.function.BinaryOperator; +import java.util.function.Function; +import java.util.function.Supplier; +import java.util.stream.Collector; + +public class OptionalDoubleSummer implements Collector, OptionalDouble> { + @Override + public Supplier> supplier() { + return () -> new Ref<>(OptionalDouble.of(0)); + } + + @Override + public BiConsumer, OptionalDouble> accumulator() { + return (ref, od) -> { + if (ref.getValue().isPresent()) { + if (od.isPresent()) { + ref.setValue(OptionalDouble.of(ref.getValue().getAsDouble() + od.getAsDouble())); + } else { + ref.setValue(OptionalDouble.empty()); + } + } + }; + } + + @Override + public BinaryOperator> combiner() { + return (ref1, ref2) -> { + accumulator().accept(ref1, ref2.getValue()); + return ref1; + }; + } + + @Override + public Function, OptionalDouble> finisher() { + return Ref::getValue; + } + + @Override + public Set characteristics() { + return Set.of(Characteristics.UNORDERED); + } +} -- cgit v1.2.3