Wrap multiple reducers or monoids into a single reducer instance,
that can be used to reduce a given steam to multiple different values simultanously
Monoid<Integer> sum = Monoid.of(0,(a,b)->a+b);
Monoid<Integer> mult = Monoid.of(1,(a,b)->a*b);
val result = tuple(sum,mult).<PTuple2<Integer,Integer>>asReducer()
.mapReduce(Stream.of(1,2,3,4));
assertThat(result,equalTo(tuple(10,24)));
Or alternatively
Monoid<String> concat = Monoid.of("",(a,b)->a+b);
Monoid<String> join = Monoid.of("",(a,b)->a+","+b);
Monoid<CachedValues> reducer = PowerTuples.tuple(concat,join).asReducer();
assertThat(Stream.of("hello", "world", "woo!").map(CachedValues::of)
.reduce(reducer.zero(),reducer.reducer())
,equalTo(tuple("helloworldwoo!",",hello,world,woo!")));