package openmods.calc; import openmods.utils.Stack; public abstract class NullaryFunction<E> extends FixedCallable<E> { private NullaryFunction() { super(0, 1); } public abstract static class Direct<E> extends NullaryFunction<E> { protected abstract E call(); @Override public final void call(Frame<E> frame) { frame.stack().push(call()); } } public abstract static class WithFrame<E> extends NullaryFunction<E> { protected abstract E callImpl(Frame<E> frame); @Override public final void call(Frame<E> frame) { final Frame<E> executionFrame = FrameFactory.newLocalFrameWithSubstack(frame, 1); final Stack<E> stack = executionFrame.stack(); final E result = callImpl(executionFrame); stack.checkIsEmpty().push(result); } } public static <E> ICallable<E> createConst(final E value) { return new NullaryFunction.Direct<E>() { @Override protected E call() { return value; } }; } }