java-commons/src/main/java/io/gitlab/jfronny/commons/throwable/ThrowingRunnable.java

69 lines
2.0 KiB
Java

package io.gitlab.jfronny.commons.throwable;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import java.util.Objects;
import java.util.function.Consumer;
@FunctionalInterface
public interface ThrowingRunnable<TEx extends Throwable> {
void run() throws TEx;
@Contract(pure = true) @NotNull @ApiStatus.NonExtendable
default ThrowingRunnable<TEx> compose(@NotNull ThrowingRunnable<? extends TEx> before) {
Objects.requireNonNull(before);
return () -> {
before.run();
this.run();
};
}
@Contract(pure = true) @NotNull @ApiStatus.NonExtendable
default ThrowingRunnable<TEx> andThen(@NotNull ThrowingRunnable<? extends TEx> after) {
Objects.requireNonNull(after);
return () -> {
this.run();
after.run();
};
}
@Contract(pure = true) @NotNull @ApiStatus.NonExtendable
default Runnable addHandler(@NotNull Consumer<Throwable> handler) {
Objects.requireNonNull(handler);
return () -> {
try {
this.run();
} catch (Throwable e) {
handler.accept(e);
}
};
}
@Contract(pure = true) @NotNull @ApiStatus.NonExtendable
default Runnable addHandler(@NotNull Class<TEx> exception, @NotNull Consumer<TEx> handler) {
Objects.requireNonNull(handler);
return () -> {
try {
this.run();
} catch (Throwable e) {
if (exception.isAssignableFrom(e.getClass()))
handler.accept((TEx) e);
else throw Try.runtimeException(e);
}
};
}
@Contract(pure = true) @NotNull @ApiStatus.NonExtendable
default Runnable orThrow() {
return () -> {
try {
this.run();
} catch (Throwable e) {
throw Try.runtimeException(e);
}
};
}
}