001/*
002 * (C) Copyright 2019 Nuxeo (http://nuxeo.com/) and others.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *      http://www.apache.org/licenses/LICENSE-2.0
009 *
010 *  Unless required by applicable law or agreed to in writing, software
011 *  distributed under the License is distributed on an "AS IS" BASIS,
012 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 *  See the License for the specific language governing permissions and
014 *  limitations under the License.
015 *
016 *  Contributors:
017 *      Kevin Leturc <kleturc@nuxeo.com>
018 */
019
020package org.nuxeo.common.function;
021
022import java.util.function.BiConsumer;
023
024/**
025 * @param <T> the type of the first argument to the operation
026 * @param <U> the type of the second argument to the operation
027 * @param <E> the type of exception to throw
028 * @since 11.5
029 */
030@FunctionalInterface
031public interface ThrowableBiConsumer<T, U, E extends Throwable> {
032
033    void accept(T t, U u) throws E;
034
035    /**
036     * @return this {@link ThrowableBiConsumer} as a {@link BiConsumer} throwing the checked exception as an unchecked
037     *         one
038     */
039    default BiConsumer<T, U> toBiConsumer() {
040        return asBiConsumer(this);
041    }
042
043    /**
044     * @return the given {@link ThrowableBiConsumer} as a {@link BiConsumer} throwing the checked exception as an
045     *         unchecked one
046     */
047    static <T, U, E extends Throwable> BiConsumer<T, U> asBiConsumer(ThrowableBiConsumer<T, U, E> throwableBiConsumer) {
048        return (l, r) -> {
049            try {
050                throwableBiConsumer.accept(l, r);
051            } catch (Throwable t) { // NOSONAR
052                FunctionUtils.sneakyThrow(t);
053            }
054        };
055    }
056
057}