package fmlist;
import fj.F;
import fj.F2;
import fj.F3;
import fj.F4;
import fj.F5;
import fj.Monoid;
abstract class TransformCSFunc<A, B, S> {
abstract <M> M f(Monoid<M> m, F<B, M> f, A e, F2<M, S, M> c, S i);
<M> F<S, M> f(Monoid<M> m, F<B, M> f, A e, F2<M, S, M> c) {
final TransformCSFunc<A, B, S> self = this;
final Monoid<M> m_ = m;
final F<B, M> f_ = f;
final A e_ = e;
final F2<M, S, M> c_ = c;
return new F<S, M>() {
@Override
public M f(S a) {
return self.f(m_, f_, e_, c_, a);
}
};
}
<M> F2<F2<M, S, M>, S, M> f(Monoid<M> m, F<B, M> f, A e) {
final TransformCSFunc<A, B, S> self = this;
final Monoid<M> m_ = m;
final F<B, M> f_ = f;
final A e_ = e;
return new F2<F2<M, S, M>, S, M>() {
@Override
public M f(F2<M, S, M> a, S b) {
return self.f(m_, f_, e_, a, b);
}
};
}
<M> F3<A, F2<M, S, M>, S, M> f(Monoid<M> m, F<B, M> f) {
final TransformCSFunc<A, B, S> self = this;
final Monoid<M> m_ = m;
final F<B, M> f_ = f;
return new F3<A, F2<M, S, M>, S, M>() {
@Override
public M f(A a, F2<M, S, M> b, S c) {
return self.f(m_, f_, a, b, c);
}
};
}
<M> F4<F<B, M>, A, F2<M, S, M>, S, M> f(Monoid<M> m) {
final TransformCSFunc<A, B, S> self = this;
final Monoid<M> m_ = m;
return new F4<F<B, M>, A, F2<M, S, M>, S, M>() {
@Override
public M f(F<B, M> a, A b, F2<M, S, M> c, S d) {
return self.f(m_, a, b, c, d);
}
};
}
<M> F5<Monoid<M>, F<B, M>, A, F2<M, S, M>, S, M> f() {
final TransformCSFunc<A, B, S> self = this;
return new F5<Monoid<M>, F<B, M>, A, F2<M, S, M>, S, M>() {
@Override
public M f(Monoid<M> a, F<B, M> b, A c, F2<M, S, M> d, S e) {
return self.f(a, b, c, d, e);
}
};
}
}