package de.is24.guava;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import de.is24.deadcode4j.Utils;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
/**
* Provides convenience methods for {@link de.is24.guava.NonNullFunction}.
*
* @since 2.0.0
*/
public final class NonNullFunctions {
private NonNullFunctions() {}
/**
* Returns a <code>NonNullFunction</code> that will call the specified functions one by one until a return value is
* <i>present</i> or the end of the call chain is reached.
*
* @since 2.0.0
*/
@Nonnull
public static <F, T> NonNullFunction<F, Optional<T>> or(@Nonnull final NonNullFunction<F, Optional<T>>... functions) {
return new NonNullFunction<F, Optional<T>>() {
@Nonnull
@Override
public Optional<T> apply(@Nonnull F input) {
for (int i = 0; ; ) {
Optional<T> result = functions[i++].apply(input);
if (result.isPresent() || i == functions.length) {
return result;
}
}
}
};
}
/**
* Transforms a <code>NonNullFunction</code> into a <code>Function</code>.
* If a <code>Function</code>'s input is <code>null</code>, a <code>NullPointerException</code> is thrown.
*
* @since 2.0.0
*/
@Nonnull
public static <F, T> Function<F, T> toFunction(@Nonnull final NonNullFunction<F, T> nonNullFunction) {
return new Function<F, T>() {
@Nullable
@Override
@SuppressWarnings("ConstantConditions")
public T apply(@Nullable F input) {
return nonNullFunction.apply(Utils.checkNotNull(input));
}
};
}
}