public static Monoid<Double> toTotalDouble(){ return Monoid.of(0.0, (a,b) -> a+b); } public static Monoid<Double> toCountDouble(){
public static Monoid<String> toString(String joiner){ return Monoid.of("", (a,b) -> a + joiner +b); } public static Monoid<Integer> toTotalInt(){
public static Monoid<Integer> toTotalInt(){ return Monoid.of(0, (a,b) -> a+b); } public static Monoid<Integer> toCountInt(){
public static Monoid<Double> toCountDouble(){ return Monoid.of(0.0, a->b -> a+1,(x) -> Double.valueOf(""+x)); }
public static Monoid<Integer> toCountInt(){ return Monoid.of(0, a ->b -> a+1,(x) -> Integer.valueOf(""+x)); }
/** * Scan left * <pre> * {@code * assertThat(of("a", "b", "c").scanLeft("", String::concat).toList().size(), is(4)); * } * </pre> */ public final SequenceM<T> scanLeft(T identity,BiFunction<T, T, T> combiner) { return scanLeft(Monoid.of(identity,combiner)); }
/** * Scan right * * <pre> * {@code * assertThat(of("a", "ab", "abc").map(str->str.length()).scanRight(0, (t, u) -> u + t).toList().size(), is(asList(0, 3, 5, 6).size())); * * } * </pre> */ public final<U> SequenceM<T> scanRight(T identity,BiFunction<T,T,T> combiner) { return scanRight(Monoid.of(identity,combiner)); }
/** * Immutable reduction from right to left * <pre> * {@code * assertTrue(SequenceM.of("a","b","c").foldRight("", String::concat).equals("cba")); * } * </pre> * * @param identity * @param accumulator * @return */ public final T foldRight(T identity, BinaryOperator<T> accumulator){ return foldRight(Monoid.of(identity, accumulator)); } /**
public static <K,V> Monoid<PMap<K,V>> toPMap() { return Monoid.<PMap<K,V>>of(HashTreePMap.empty(), (PMap<K,V> a) -> b -> a.plusAll(b)); }
public static <T> Monoid<PStack<T>> toPStack() { return Monoid.<PStack<T>>of(ConsPStack.empty(), (PStack<T> a) -> b -> a.plusAll(b), (T x) -> ConsPStack.singleton(x)); } public static <K,V> Monoid<PMap<K,V>> toPMap() {
public final AnyM<T> reduceM(Monoid<AnyM<T>> reducer){ // List(2, 8, 3, 1).foldLeftM(0) {binSmalls} -> Optional(14) // convert to list Optionals return monad.reduceM(Monoid.of(reducer.zero().unwrap(), (a,b)-> reducer.combiner().apply(AsAnyM.notTypeSafeAnyM(a), AsAnyM.notTypeSafeAnyM(b)))).anyM(); }