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);
}
};
}
}