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 ThrowingConsumer { void accept(T var1) throws TEx; @Contract(pure = true) @NotNull @ApiStatus.NonExtendable default ThrowingConsumer compose(@NotNull ThrowingFunction before) { Objects.requireNonNull(before); return (t) -> this.accept(before.apply(t)); } @Contract(pure = true) @NotNull @ApiStatus.NonExtendable default ThrowingRunnable compose(@NotNull ThrowingSupplier before) { Objects.requireNonNull(before); return () -> this.accept(before.get()); } @Contract(pure = true) @NotNull @ApiStatus.NonExtendable default ThrowingConsumer andThen(@NotNull ThrowingConsumer after) { Objects.requireNonNull(after); return (t) -> { this.accept(t); after.accept(t); }; } @Contract(pure = true) @NotNull @ApiStatus.NonExtendable default ThrowingConsumer andThen(@NotNull ThrowingRunnable after) { Objects.requireNonNull(after); return (t) -> { this.accept(t); after.run(); }; } @Contract(pure = true) @NotNull @ApiStatus.NonExtendable default ThrowingBiConsumer compound(@NotNull ThrowingConsumer other) { Objects.requireNonNull(other); return (l, r) -> { this.accept(l); other.accept(r); }; } @Contract(pure = true) @NotNull @ApiStatus.NonExtendable default Consumer addHandler(@NotNull Consumer handler) { Objects.requireNonNull(handler); return (t) -> { try { this.accept(t); } catch (Throwable e) { handler.accept(e); } }; } @Contract(pure = true) @NotNull @ApiStatus.NonExtendable default Consumer addHandler(@NotNull Class exception, @NotNull Consumer handler) { Objects.requireNonNull(handler); return (t) -> { try { this.accept(t); } catch (Throwable e) { if (exception.isAssignableFrom(e.getClass())) handler.accept((TEx) e); else throw Try.runtimeException(e); } }; } @Contract(pure = true) @NotNull @ApiStatus.NonExtendable default Consumer orThrow() { return (t) -> { try { this.accept(t); } catch (Throwable e) { throw Try.runtimeException(e); } }; } }