@Override
 public void batchCursor(final SingleResultCallback<AsyncBatchCursor<U>> callback) {
   notNull("callback", callback);
   iterable.batchCursor(
       new SingleResultCallback<AsyncBatchCursor<T>>() {
         @Override
         public void onResult(final AsyncBatchCursor<T> batchCursor, final Throwable t) {
           if (t != null) {
             callback.onResult(null, t);
           } else {
             callback.onResult(new MappingAsyncBatchCursor<T, U>(batchCursor, mapper), null);
           }
         }
       });
 }
 @Override
 public void first(final SingleResultCallback<U> callback) {
   notNull("callback", callback);
   iterable.first(
       new SingleResultCallback<T>() {
         @Override
         public void onResult(final T result, final Throwable t) {
           if (t != null) {
             callback.onResult(null, t);
           } else {
             callback.onResult(mapper.apply(result), null);
           }
         }
       });
 }
 @Override
 public void forEach(final Block<? super U> block, final SingleResultCallback<Void> callback) {
   notNull("block", block);
   notNull("callback", callback);
   iterable.forEach(
       new Block<T>() {
         @Override
         public void apply(final T t) {
           block.apply(mapper.apply(t));
         }
       },
       new SingleResultCallback<Void>() {
         @Override
         public void onResult(final Void result, final Throwable t) {
           if (t != null) {
             callback.onResult(null, t);
           } else {
             callback.onResult(null, null);
           }
         }
       });
 }
 @Override
 public <A extends Collection<? super U>> void into(
     final A target, final SingleResultCallback<A> callback) {
   notNull("target", target);
   notNull("callback", callback);
   iterable.forEach(
       new Block<T>() {
         @Override
         public void apply(final T t) {
           target.add(mapper.apply(t));
         }
       },
       new SingleResultCallback<Void>() {
         @Override
         public void onResult(final Void result, final Throwable t) {
           if (t != null) {
             callback.onResult(null, t);
           } else {
             callback.onResult(target, null);
           }
         }
       });
 }
 @Override
 public MongoIterable<U> batchSize(final int batchSize) {
   iterable.batchSize(batchSize);
   return this;
 }