// Path: cacheio-core/src/main/java/com/mobilejazz/cacheio/FutureCache.java
// public interface FutureCache<K, V> {
// 
//   Future<V> get(K key);
// 
//   Future<V> put(K key, V value, long expiry, TimeUnit unit);
// 
//   Future<K> remove(K key);
// 
//   Future<Map<K, V>> getAll(Collection<K> keys);
// 
//   Future<Map<K, V>> putAll(Map<K, V> map, long expiry, TimeUnit unit);
// 
//   Future<Collection<K>> removeAll(Collection<K> keys);
// 
// }
// 
// Path: cacheio-core/src/main/java/com/mobilejazz/cacheio/RxCache.java
// public interface RxCache<K, V> {
// 
//   Single<V> get(K key);
// 
//   Single<V> put(K key, V value, long expiry, TimeUnit unit);
// 
//   Single<K> remove(K key);
// 
//   Single<Map<K, V>> getAll(Collection<K> keys);
// 
//   Single<Map<K, V>> putAll(Map<K, V> map, long expiry, TimeUnit unit);
// 
//   Single<Collection<K>> removeAll(Collection<K> keys);
// 
// }
// 
// Path: cacheio-core/src/main/java/com/mobilejazz/cacheio/helper/Preconditions.java
// public static <T> T checkArgument(T object, String message) {
//   if (object == null) {
//     throw new IllegalArgumentException(message);
//   }
// 
//   return object;
// }


import com.mobilejazz.cacheio.FutureCache;
import com.mobilejazz.cacheio.RxCache;
import rx.Single;
import java.util.*;
import java.util.concurrent.*;
import static com.mobilejazz.cacheio.helper.Preconditions.checkArgument;

  @Override public Future<Collection<K>> removeAll(Collection<K> keys) {
    return future(config.delegate.removeAll(keys));
  }

  public static <K, V> Builder<K, V> newBuilder(Class<K> keyType, Class<V> valueType) {
    return new Builder<K, V>().setKeyType(keyType).setValueType(valueType);
  }

  public static final class Builder<K, V> {

    private RxCache<K, V> delegate;

    private Class<K> keyType;
    private Class<V> valueType;

    private Builder() {
    }

    private Builder(Builder<K, V> proto) {
      this.delegate = proto.delegate;
      this.keyType = proto.keyType;
      this.valueType = proto.valueType;
    }

    public Builder<K, V> setDelegate(RxCache<K, V> delegate) {
      this.delegate = delegate;
      return this;
    }

// Path: cacheio-core/src/main/java/com/mobilejazz/cacheio/FutureCache.java
// public interface FutureCache<K, V> {
// 
//   Future<V> get(K key);
// 
//   Future<V> put(K key, V value, long expiry, TimeUnit unit);
// 
//   Future<K> remove(K key);
// 
//   Future<Map<K, V>> getAll(Collection<K> keys);
// 
//   Future<Map<K, V>> putAll(Map<K, V> map, long expiry, TimeUnit unit);
// 
//   Future<Collection<K>> removeAll(Collection<K> keys);
// 
// }
// 
// Path: cacheio-core/src/main/java/com/mobilejazz/cacheio/RxCache.java
// public interface RxCache<K, V> {
// 
//   Single<V> get(K key);
// 
//   Single<V> put(K key, V value, long expiry, TimeUnit unit);
// 
//   Single<K> remove(K key);
// 
//   Single<Map<K, V>> getAll(Collection<K> keys);
// 
//   Single<Map<K, V>> putAll(Map<K, V> map, long expiry, TimeUnit unit);
// 
//   Single<Collection<K>> removeAll(Collection<K> keys);
// 
// }
// 
// Path: cacheio-core/src/main/java/com/mobilejazz/cacheio/helper/Preconditions.java
// public static <T> T checkArgument(T object, String message) {
//   if (object == null) {
//     throw new IllegalArgumentException(message);
//   }
// 
//   return object;
// }


// Path: cacheio-core/src/main/java/com/mobilejazz/cacheio/wrappers/FutureCacheWrapper.java
import com.mobilejazz.cacheio.FutureCache;
import com.mobilejazz.cacheio.RxCache;
import rx.Single;
import java.util.*;
import java.util.concurrent.*;
import static com.mobilejazz.cacheio.helper.Preconditions.checkArgument;


  @Override public Future<Collection<K>> removeAll(Collection<K> keys) {
    return future(config.delegate.removeAll(keys));
  }

  public static <K, V> Builder<K, V> newBuilder(Class<K> keyType, Class<V> valueType) {
    return new Builder<K, V>().setKeyType(keyType).setValueType(valueType);
  }

  public static final class Builder<K, V> {

    private RxCache<K, V> delegate;

    private Class<K> keyType;
    private Class<V> valueType;

    private Builder() {
    }

    private Builder(Builder<K, V> proto) {
      this.delegate = proto.delegate;
      this.keyType = proto.keyType;
      this.valueType = proto.valueType;
    }

    public Builder<K, V> setDelegate(RxCache<K, V> delegate) {
      this.delegate = delegate;
      return this;
    }

    protected Builder<K, V> setKeyType(Class<K> keyType) {