code: @NotNull
      public Exceptional<T> recover(@NotNull final ThrowableFunction<Throwable, ? extends T, Throwable> function) {
          if (throwable == null) return this;
  
          Objects.requireNonNull(function);
          try {
              return new Exceptional<T>(function.apply(throwable), null);
          } catch (Throwable throwable) {
              return of(throwable);
          }
      }
docs: Returns current {@code Exceptional} if there were no exceptions, otherwise
  calls {@code function} and wraps produced result with an {@code Exceptional}.
  
  @param function  recovering function
  @return this {@code Exceptional} if there were no exceptions, otherwise
  an {@code Exceptional} with wrapped recovering function result
  @throws NullPointerException if {@code function} is null
  @since 1.1.2