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.Function;
023
024/**
025 * @param <T> the type of the input to the function
026 * @param <R> the type of the result of the function
027 * @param <E> the type of exception to throw
028 * @since 11.1
029 */
030@FunctionalInterface
031public interface ThrowableFunction<T, R, E extends Throwable> {
032
033    R apply(T t) throws E;
034
035    /**
036     * @return this {@link ThrowableFunction} as a {@link Function} throwing the checked exception as an unchecked one
037     */
038    default Function<T, R> toFunction() {
039        return asFunction(this);
040    }
041
042    /**
043     * @return the given {@link ThrowableFunction} as a {@link Function} throwing the checked exception as an unchecked
044     *         one
045     */
046    static <T, R, E extends Throwable> Function<T, R> asFunction(ThrowableFunction<T, R, E> throwableFunction) {
047        return arg -> {
048            try {
049                return throwableFunction.apply(arg);
050            } catch (Throwable t) { // NOSONAR
051                return FunctionUtils.sneakyThrow(t); // will never return
052            }
053        };
054    }
055
056}