// Path: easymvp-rx2-api/src/main/java/easymvp/executer/PostExecutionThread.java
// public interface PostExecutionThread {
//     Scheduler getScheduler();
// }
// 
// Path: easymvp-rx-api/src/main/java/easymvp/executer/UseCaseExecutor.java
// public interface UseCaseExecutor {
//     Scheduler getScheduler();
// }


import javax.annotation.Nullable;
import easymvp.executer.PostExecutionThread;
import easymvp.executer.UseCaseExecutor;
import rx.Observable;
package easymvp.usecase;



/**
 * Reactive version of a {@link UseCase}.
 * <p>
 * The presenter simply subscribes to {@link Observable} returned by the {@link #execute(Object)} method.
 *
 * @param <R> The response value emitted by the Observable.
 * @param <Q> The request value.
 * @author Saeed Masoumi (saeed@6thsolution.com)
 * @see  Observable
 */
public abstract class ObservableUseCase<R, Q> extends UseCase<Observable, Q> {

    private final Observable.Transformer<? super R, ? extends R> schedulersTransformer;

// Path: easymvp-rx2-api/src/main/java/easymvp/executer/PostExecutionThread.java
// public interface PostExecutionThread {
//     Scheduler getScheduler();
// }
// 
// Path: easymvp-rx-api/src/main/java/easymvp/executer/UseCaseExecutor.java
// public interface UseCaseExecutor {
//     Scheduler getScheduler();
// }


// Path: easymvp-rx-api/src/main/java/easymvp/usecase/ObservableUseCase.java
import javax.annotation.Nullable;
import easymvp.executer.PostExecutionThread;
import easymvp.executer.UseCaseExecutor;
import rx.Observable;

package easymvp.usecase;



/**
 * Reactive version of a {@link UseCase}.
 * <p>
 * The presenter simply subscribes to {@link Observable} returned by the {@link #execute(Object)} method.
 *
 * @param <R> The response value emitted by the Observable.
 * @param <Q> The request value.
 * @author Saeed Masoumi (saeed@6thsolution.com)
 * @see  Observable
 */
public abstract class ObservableUseCase<R, Q> extends UseCase<Observable, Q> {

    private final Observable.Transformer<? super R, ? extends R> schedulersTransformer;

    public ObservableUseCase(final UseCaseExecutor useCaseExecutor,