package fj; import static fj.Unit.unit; /** * Represents a side-effect. * * @version %build.number% */ public abstract class Effect { public abstract void e(A a); /** * Returns a function for the given effect. * * @return The function using the given effect. */ public final F e() { return new F() { public Unit f(final A a) { e(a); return unit(); } }; } /** * A contra-variant functor on effect. * * @param f The function to map over the effect. * @return An effect after a contra-variant map. */ public final Effect comap(final F f) { return new Effect() { public void e(final B b) { Effect.this.e(f.f(b)); } }; } public static Effect f(final F f) { return new Effect() { public void e(final A a) { f.f(a); } }; } }