summaryrefslogtreecommitdiff
path: root/src/main/java/lv/enes/mc/eris_alchemy/utils/OptionalDoubleSummer.java
blob: 04b6ca8b0f0fd676d478bffe1b36cd4fd35915de (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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, Ref<OptionalDouble>, OptionalDouble> {
	@Override
	public Supplier<Ref<OptionalDouble>> supplier() {
		return () -> new Ref<>(OptionalDouble.of(0));
	}

	@Override
	public BiConsumer<Ref<OptionalDouble>, 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<Ref<OptionalDouble>> combiner() {
		return (ref1, ref2) -> {
			accumulator().accept(ref1, ref2.getValue());
			return ref1;
		};
	}

	@Override
	public Function<Ref<OptionalDouble>, OptionalDouble> finisher() {
		return Ref::getValue;
	}

	@Override
	public Set<Characteristics> characteristics() {
		return Set.of(Characteristics.UNORDERED);
	}
}