package com.googlecode.totallylazy.functions;
import com.googlecode.totallylazy.Pair;
public interface Monoid<T> extends Combiner<T, T>, Associative<T> {
@Override
default T combine(T a, T b) throws Exception {
return call(a, b);
}
static <T> Monoid<T> monoid(T identity, Binary<T> binary){
return new Monoid<T>() {
@Override
public T call(T t, T t2) throws Exception {
return binary.call(t, t2);
}
@Override
public T identity() {
return identity;
}
};
}
class functions {
public static <A, B> CurriedMonoid<Pair<A, B>> pair(final Monoid<A> aMonoid, final Monoid<B> bMonoid) {
return new CurriedMonoid<Pair<A, B>>() {
@Override
public Pair<A, B> call(Pair<A, B> a, Pair<A, B> b) throws Exception {
return Pair.pair(aMonoid.call(a.first(), b.first()), bMonoid.call(a.second(), b.second()));
}
@Override
public Pair<A, B> identity() {
return Pair.pair(aMonoid.identity(), bMonoid.identity());
}
};
}
}
}