// Path: cachedfield/src/main/java/com/byoutline/cachedfield/CachedFieldWithArg.java
// public interface CachedFieldWithArg<RETURN_TYPE, ARG_TYPE> {
// 
//     FieldState getState();
// 
//     /**
//      * Informs {@link SuccessListener} when value is ready.
//      *
//      * @param arg Argument needed to calculate value.
//      */
//     void postValue(ARG_TYPE arg);
// 
//     /**
//      * Force value to refresh(be fetched again from remote source or calculated
//      * again).
//      *
//      * @param arg Argument needed to calculate value.
//      */
//     void refresh(ARG_TYPE arg);
// 
//     StateAndValue<RETURN_TYPE, ARG_TYPE> getStateAndValue();
// 
//     /**
//      * Forget cached value, so memory can be reclaimed.
//      */
//     void drop();
// 
//     /**
//      * Register listener that will be informed each time {@link FieldState}
//      * changes.
//      *
//      * @param listener
//      * @throws IllegalArgumentException if listener is null
//      */
//     void addStateListener(FieldStateListener listener);
// 
//     /**
//      * Remove field state listener
//      *
//      * @param listener
//      * @return true if listeners collection was modified by this operation,
//      * false otherwise
//      * @throws IllegalArgumentException if listener is null
//      */
//     boolean removeStateListener(FieldStateListener listener);
// }
// 
// Path: cachedfield/src/main/java/com/byoutline/cachedfield/ProviderWithArg.java
// public interface ProviderWithArg<RETURN_TYPE, ARG_TYPE> {
// 
//     RETURN_TYPE get(ARG_TYPE arg);
// }
// 
// Path: ibuscachedfield/src/main/java/com/byoutline/ibuscachedfield/events/ResponseEventWithArg.java
// public interface ResponseEventWithArg<RETURN_TYPE, ARG_TYPE> {
// 
//     /**
//      * @param value    response from server/or calculated value.
//      * @param argValue argument that was used to get value.
//      */
//     void setResponse(RETURN_TYPE value, ARG_TYPE argValue);
// }


import com.byoutline.cachedfield.CachedFieldWithArg;
import com.byoutline.cachedfield.ProviderWithArg;
import com.byoutline.ibuscachedfield.events.ResponseEventWithArg;
import javax.inject.Provider;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
package com.byoutline.ibuscachedfield.builders;



/**
 * @param <RETURN_TYPE>  Type of object to be cached.
 * @param <ARG_TYPE>     Type of argument that needs to be passed to calculate value.
 * @param <BUS>          type of Bus that can be used to post events.
 *                       {@link CachedFieldWithArg} build.
 * @param <CACHED_FIELD> Specific type of {@link CachedFieldWithArg} returned.
 */
public interface CachedFieldWithArgConstructorWrapper
        <RETURN_TYPE, ARG_TYPE, BUS, CACHED_FIELD extends CachedFieldWithArg<RETURN_TYPE, ARG_TYPE>> {

// Path: cachedfield/src/main/java/com/byoutline/cachedfield/CachedFieldWithArg.java
// public interface CachedFieldWithArg<RETURN_TYPE, ARG_TYPE> {
// 
//     FieldState getState();
// 
//     /**
//      * Informs {@link SuccessListener} when value is ready.
//      *
//      * @param arg Argument needed to calculate value.
//      */
//     void postValue(ARG_TYPE arg);
// 
//     /**
//      * Force value to refresh(be fetched again from remote source or calculated
//      * again).
//      *
//      * @param arg Argument needed to calculate value.
//      */
//     void refresh(ARG_TYPE arg);
// 
//     StateAndValue<RETURN_TYPE, ARG_TYPE> getStateAndValue();
// 
//     /**
//      * Forget cached value, so memory can be reclaimed.
//      */
//     void drop();
// 
//     /**
//      * Register listener that will be informed each time {@link FieldState}
//      * changes.
//      *
//      * @param listener
//      * @throws IllegalArgumentException if listener is null
//      */
//     void addStateListener(FieldStateListener listener);
// 
//     /**
//      * Remove field state listener
//      *
//      * @param listener
//      * @return true if listeners collection was modified by this operation,
//      * false otherwise
//      * @throws IllegalArgumentException if listener is null
//      */
//     boolean removeStateListener(FieldStateListener listener);
// }
// 
// Path: cachedfield/src/main/java/com/byoutline/cachedfield/ProviderWithArg.java
// public interface ProviderWithArg<RETURN_TYPE, ARG_TYPE> {
// 
//     RETURN_TYPE get(ARG_TYPE arg);
// }
// 
// Path: ibuscachedfield/src/main/java/com/byoutline/ibuscachedfield/events/ResponseEventWithArg.java
// public interface ResponseEventWithArg<RETURN_TYPE, ARG_TYPE> {
// 
//     /**
//      * @param value    response from server/or calculated value.
//      * @param argValue argument that was used to get value.
//      */
//     void setResponse(RETURN_TYPE value, ARG_TYPE argValue);
// }


// Path: ibuscachedfield/src/main/java/com/byoutline/ibuscachedfield/builders/CachedFieldWithArgConstructorWrapper.java
import com.byoutline.cachedfield.CachedFieldWithArg;
import com.byoutline.cachedfield.ProviderWithArg;
import com.byoutline.ibuscachedfield.events.ResponseEventWithArg;
import javax.inject.Provider;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;

package com.byoutline.ibuscachedfield.builders;



/**
 * @param <RETURN_TYPE>  Type of object to be cached.
 * @param <ARG_TYPE>     Type of argument that needs to be passed to calculate value.
 * @param <BUS>          type of Bus that can be used to post events.
 *                       {@link CachedFieldWithArg} build.
 * @param <CACHED_FIELD> Specific type of {@link CachedFieldWithArg} returned.
 */
public interface CachedFieldWithArgConstructorWrapper
        <RETURN_TYPE, ARG_TYPE, BUS, CACHED_FIELD extends CachedFieldWithArg<RETURN_TYPE, ARG_TYPE>> {

    CACHED_FIELD build(Provider<String> sessionIdProvider,