package org.fungsi.experimental; import org.fungsi.Either; import org.fungsi.Unit; import org.fungsi.function.UnsafeRunnable; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; import java.util.function.Supplier; import static org.fungsi.Either.failure; @Deprecated public final class ConsumerBuilder<T> { private ConsumerBuilder() {} public static <T> ConsumerBuilder<T> start() { return new ConsumerBuilder<>(); } public static <T> ConsumerBuilder<T> start(Class<T> ignored) { return start(); } public static <T> ConsumerBuilder<T> consumer(Class<T> ignored) { return start(); } @FunctionalInterface private interface Matcher<T> { Either<Unit, Throwable> accept(T param); } private Matcher<T> result = param -> failure(new IllegalArgumentException()); private ConsumerBuilder<T> decorate(Function<Matcher<T>, Matcher<T>> fn) { result = fn.apply(result); return this; } public ConsumerBuilder<T> matchIf(Predicate<T> filter, Consumer<T> fn) { return decorate(old -> param -> { if (filter.test(param)) { fn.accept(param); return Unit.left(); } return old.accept(param); }); } public <A extends T> ConsumerBuilder<T> matchClass(Class<A> klass, Consumer<A> fn) { return matchIf(klass::isInstance, param -> fn.accept(klass.cast(param))); } public <A extends T> ConsumerBuilder<T> matchEqual(A instance, Consumer<A> fn) { return matchIf(instance::equals, param -> fn.accept(instance)); } public ConsumerBuilder<T> ifNull(Runnable fn) { return matchIf(param -> param == null, param -> fn.run()); } public Consumer<T> asConsumer() { return param -> Either.<Unit>unsafe(result.accept(param)); } public Consumer<T> otherwise(UnsafeRunnable fn) { return param -> result.accept(param).leftFallback(fn::safelyRun); } public Consumer<T> orFail(Supplier<Throwable> fn) { return param -> result.accept(param).leftOrThrow(fn); } }