code: @CheckReturnValue
      @SchedulerSupport(SchedulerSupport.NONE)
      public static <T, U> Single<T> using(
              final Callable<U> resourceSupplier,
              final Function<? super U, ? extends SingleSource<? extends T>> singleFunction,
              final Consumer<? super U> disposer,
              final boolean eager) {
          ObjectHelper.requireNonNull(resourceSupplier, "resourceSupplier is null");
          ObjectHelper.requireNonNull(singleFunction, "singleFunction is null");
          ObjectHelper.requireNonNull(disposer, "disposer is null");
  
          return RxJavaPlugins.onAssembly(new SingleUsing<T, U>(resourceSupplier, singleFunction, disposer, eager));
      }
docs: Allows using and disposing a resource while running a SingleSource instance generated from
  that resource (similar to a try-with-resources).
  <dl>
  <dt><b>Scheduler:</b></dt>
  <dd>{@code using} does not operate by default on a particular {@link Scheduler}.</dd>
  </dl>
  @param <T> the value type of the SingleSource generated
  @param <U> the resource type
  @param resourceSupplier the Callable called for each SingleObserver to generate a resource Object
  @param singleFunction the function called with the returned resource
  Object from {@code resourceSupplier} and should return a SingleSource instance
  to be run by the operator
  @param disposer the consumer of the generated resource that is called exactly once for
  that particular resource when the generated SingleSource terminates
  (successfully or with an error) or gets disposed.
  @param eager
  if true, the disposer is called before the terminal event is signalled
  if false, the disposer is called after the terminal event is delivered to downstream
  @return the new Single instance
  @since 2.0