class Result {

  @SuppressWarnings("ConstantConditions")
  @NonNull
  public T recover(@NonNull final Function<? super Throwable, ? extends T> recoverFunction) {
    if (value != null) {
      return value;
    }
    return recoverFunction.apply(failure);
  }

    Result(@Nullable final T value, @Nullable final Throwable failure);

}