class Result {

  @NonNull
  public <U, V> Result<V> ifSucceededAttemptMerge(@NonNull final U mergeValue,
      @NonNull final Merger<? super T, ? super U, Result<V>> attemptMerger) {
    if (value != null) {
      return attemptMerger.merge(value, mergeValue);
    }
    return sameFailure();
  }

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

}