package tc.oc.pgm.portals; import java.util.function.DoubleUnaryOperator; public interface DoubleTransform extends DoubleUnaryOperator, InvertibleOperator<DoubleTransform> { Identity IDENTITY = new Identity(); class Identity implements DoubleTransform { private Identity() {} @Override public double applyAsDouble(double old) { return old; } @Override public boolean invertible() { return true; } @Override public DoubleTransform inverse() { return this; } } class Translate implements DoubleTransform { public static final Translate ZERO = new Translate(0); private final double delta; public Translate(double delta) { this.delta = delta; } @Override public double applyAsDouble(double old) { return old + this.delta; } @Override public boolean invertible() { return true; } @Override public Translate inverse() { if(this.delta == 0) { return ZERO; } else { return new Translate(-this.delta); } } } class Constant implements DoubleTransform { private final double value; public Constant(double value) { this.value = value; } @Override public boolean invertible() { return false; } @Override public double applyAsDouble(double old) { return this.value; } } }