package io.gitlab.jfronny.commons.throwable; import io.gitlab.jfronny.commons.tuple.Tuple; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import java.util.Objects; import java.util.function.BiConsumer; import java.util.function.Consumer; @FunctionalInterface public interface ThrowingBiConsumer { void accept(T var1, U var2) throws TEx; @Contract(pure = true) @NotNull @ApiStatus.NonExtendable default ThrowingConsumer, TEx> fromTuple() { return (t) -> this.accept(t.left(), t.right()); } @Contract(pure = true) @NotNull @ApiStatus.NonExtendable default ThrowingConsumer compose(@NotNull ThrowingFunction left, @NotNull ThrowingFunction right) { Objects.requireNonNull(left); Objects.requireNonNull(right); return (t) -> this.accept(left.apply(t), right.apply(t)); } @Contract(pure = true) @NotNull @ApiStatus.NonExtendable default ThrowingBiConsumer biCompose(@NotNull ThrowingFunction left, @NotNull ThrowingFunction right) { Objects.requireNonNull(left); Objects.requireNonNull(right); return (l, r) -> this.accept(left.apply(l), right.apply(r)); } @Contract(pure = true) @NotNull @ApiStatus.NonExtendable default ThrowingBiConsumer composeLeft(@NotNull ThrowingFunction before) { Objects.requireNonNull(before); return (l, r) -> this.accept(before.apply(l), r); } @Contract(pure = true) @NotNull @ApiStatus.NonExtendable default ThrowingBiConsumer composeRight(@NotNull ThrowingFunction before) { Objects.requireNonNull(before); return (l, r) -> this.accept(l, before.apply(r)); } @Contract(pure = true) @NotNull @ApiStatus.NonExtendable default ThrowingBiConsumer andThen(@NotNull ThrowingBiConsumer after) { Objects.requireNonNull(after); return (l, r) -> { this.accept(l, r); after.accept(l, r); }; } @Contract(pure = true) @NotNull @ApiStatus.NonExtendable default ThrowingBiConsumer andThen(@NotNull ThrowingRunnable after) { Objects.requireNonNull(after); return (l, r) -> { this.accept(l, r); after.run(); }; } @Contract(pure = true) @NotNull @ApiStatus.NonExtendable default BiConsumer addHandler(@NotNull Consumer handler) { Objects.requireNonNull(handler); return (l, r) -> { try { this.accept(l, r); } catch (Throwable e) { handler.accept(e); } }; } @Contract(pure = true) @NotNull @ApiStatus.NonExtendable default BiConsumer addHandler(@NotNull Class exception, @NotNull Consumer handler) { Objects.requireNonNull(handler); return (l, r) -> { try { this.accept(l, r); } catch (Throwable e) { if (exception.isAssignableFrom(e.getClass())) handler.accept((TEx) e); else throw Try.runtimeException(e); } }; } @Contract(pure = true) @NotNull @ApiStatus.NonExtendable default BiConsumer orThrow() { return (l, r) -> { try { this.accept(l, r); } catch (Throwable e) { throw Try.runtimeException(e); } }; } }