package tc.oc.minecraft.suspend;
import tc.oc.commons.core.util.ThrowingRunnable;
/**
* Something that reacts to the server going into a suspended state.
*
* Implementors can override {@link #suspend()} and/or {@link #resume()}
* to be called before/after suspension, or they can override
* {@link #suspend(ThrowingRunnable)} to be called around suspension.
*
* Suspendables are registered through a {@link SuspendableBinder}.
*/
public interface Suspendable {
/**
* Called when the server suspends. MUST call yielder.
*/
default <X extends Throwable> void suspend(ThrowingRunnable<X> yielder) throws X {
suspend();
try {
yielder.runThrows();
} finally {
resume();
}
}
default void suspend() {}
default void resume() {}
}