From fff6dc5d43539af05ae2679640240b8545b36947 Mon Sep 17 00:00:00 2001 From: bculkin2442 Date: Tue, 10 May 2016 21:58:08 -0400 Subject: Added interface to JDK collector API --- .../bjc/utils/funcutils/CompoundCollector.java | 97 ++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 BJC-Utils2/src/main/java/bjc/utils/funcutils/CompoundCollector.java (limited to 'BJC-Utils2/src/main/java/bjc/utils/funcutils/CompoundCollector.java') diff --git a/BJC-Utils2/src/main/java/bjc/utils/funcutils/CompoundCollector.java b/BJC-Utils2/src/main/java/bjc/utils/funcutils/CompoundCollector.java new file mode 100644 index 0000000..715a6e5 --- /dev/null +++ b/BJC-Utils2/src/main/java/bjc/utils/funcutils/CompoundCollector.java @@ -0,0 +1,97 @@ +package bjc.utils.funcutils; + +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; +import java.util.stream.Collector.Characteristics; + +import bjc.utils.data.IHolder; +import bjc.utils.data.IPair; +import bjc.utils.data.Identity; +import bjc.utils.data.Pair; + +final class CompoundCollector + implements + Collector>, IPair> { + private Set characteristicSet; + + private Collector firstCollector; + private Collector secondCollector; + + public CompoundCollector( + Collector firstCollector, + Collector secondCollector) { + this.firstCollector = firstCollector; + this.secondCollector = secondCollector; + + characteristicSet = firstCollector.characteristics(); + characteristicSet.addAll(secondCollector.characteristics()); + } + + @Override + public Supplier>> supplier() { + return () -> new Identity<>( + new Pair<>(firstCollector.supplier().get(), + secondCollector.supplier().get())); + } + + @Override + public BiConsumer>, InitialType> + accumulator() { + BiConsumer firstAccumulator = + firstCollector.accumulator(); + BiConsumer secondAccumulator = + secondCollector.accumulator(); + + return (state, value) -> { + state.doWith((statePair) -> { + statePair.doWith((leftState, rightState) -> { + firstAccumulator.accept(leftState, value); + secondAccumulator.accept(rightState, value); + }); + }); + }; + } + + @Override + public BinaryOperator>> + combiner() { + BinaryOperator firstCombiner = + firstCollector.combiner(); + BinaryOperator secondCombiner = + secondCollector.combiner(); + + return (leftState, rightState) -> { + return leftState.unwrap((leftPair) -> { + return rightState.transform((rightPair) -> { + return leftPair.combine(rightPair, firstCombiner, + secondCombiner); + }); + }); + }; + } + + @Override + public Function>, IPair> + finisher() { + return (state) -> { + return state.unwrap((pair) -> { + return pair.bind((leftVal, rightVal) -> { + return new Pair<>( + firstCollector.finisher().apply(leftVal), + secondCollector.finisher() + .apply(rightVal)); + }); + }); + }; + } + + @Override + public Set + characteristics() { + return characteristicSet; + } +} \ No newline at end of file -- cgit v1.2.3