package org.fungsi.function; import org.fungsi.Either; import org.fungsi.Throwables; import org.fungsi.Unit; import java.util.function.Supplier; @FunctionalInterface public interface UnsafeRunnable { void run() throws Throwable; default UnsafeRunnable then(UnsafeRunnable other) { return () -> { run(); other.run(); }; } default <T> UnsafeSupplier<T> thenReturn(T o) { return () -> { run(); return o; }; } default Supplier<Either<Unit, Throwable>> safeRunnable() { return () -> { try { run(); return Unit.left(); } catch (Throwable cause) { return Either.right(cause); } }; } default Runnable unsafeRunnable() { return () -> { try { run(); } catch (Throwable t) { throw Throwables.propagate(t); } }; } default Either<Unit, Throwable> safelyRun() { return safeRunnable().get(); } static final UnsafeRunnable NOOP = () -> {}; public static UnsafeRunnable noop() { return NOOP; } }