summaryrefslogtreecommitdiff
path: root/src/main/java/lv/enes/mc/eris_alchemy/utils/OptionalDoubleSummer.java
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/OptionalDoubleSummer.java
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/OptionalDoubleSummer.java')
-rw-r--r--src/main/java/lv/enes/mc/eris_alchemy/utils/OptionalDoubleSummer.java47
1 files changed, 47 insertions, 0 deletions
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}