package cs2030s.fp; public abstract class Transformer implements Immutator { public Transformer after(Transformer g) { Transformer f = this; return new Transformer() { @Override public R invoke(N param) { return f.invoke(g.invoke(param)); } }; } public Transformer before(Transformer g) { Transformer f = this; return new Transformer() { @Override public T invoke(P param) { return g.invoke(f.invoke(param)); } }; } }