// Path: src/main/java/org/simondean/vertx/async/DefaultAsyncResult.java
// public class DefaultAsyncResult<T> implements AsyncResult<T> {
//   private Throwable cause;
//   private T result;
// 
//   public DefaultAsyncResult(Throwable cause, T result) {
//     this.cause = cause;
//     this.result = result;
//   }
// 
//   public static <T> AsyncResult<T> succeed(T result) {
//     return new DefaultAsyncResult<>(null, result);
//   }
// 
//   public static AsyncResult<Void> succeed() {
//     return succeed(null);
//   }
// 
//   public static <T> AsyncResult<T> fail(Throwable cause) {
//     if (cause == null) {
//       throw new IllegalArgumentException("cause argument cannot be null");
//     }
// 
//     return new DefaultAsyncResult<>(cause, null);
//   }
// 
//   public static <T> AsyncResult<T> fail(AsyncResult<?> result) {
//     return fail(result.cause());
//   }
// 
//   @Override
//   public T result() {
//     return result;
//   }
// 
//   @Override
//   public Throwable cause() {
//     return cause;
//   }
// 
//   @Override
//   public boolean succeeded() {
//     return cause == null;
//   }
// 
//   @Override
//   public boolean failed() {
//     return cause != null;
//   }
// }
// 
// Path: src/main/java/org/simondean/vertx/async/EachBuilder.java
// public interface EachBuilder {
//   void run(Vertx vertx, AsyncResultHandler<Void> handler);
// }
// 
// Path: src/main/java/org/simondean/vertx/async/ObjectWrapper.java
// public class ObjectWrapper<T> {
//   private T object;
// 
//   public ObjectWrapper() {
//   }
// 
//   public ObjectWrapper(T object) {
//     this.object = object;
//   }
// 
//   public void setObject(T object) {
//     this.object = object;
//   }
// 
//   public T getObject() {
//     return object;
//   }
// }


import org.simondean.vertx.async.DefaultAsyncResult;
import org.simondean.vertx.async.EachBuilder;
import org.simondean.vertx.async.ObjectWrapper;
import org.vertx.java.core.AsyncResultHandler;
import org.vertx.java.core.Vertx;
import java.util.ArrayList;
import java.util.function.BiConsumer;
package org.simondean.vertx.async.internal;



public class EachBuilderImpl<T> implements EachBuilder {
  private final Iterable<T> iterable;
  private final BiConsumer<T, AsyncResultHandler<Void>> each;

  public EachBuilderImpl(Iterable<T> iterable, BiConsumer<T, AsyncResultHandler<Void>> each) {
    this.iterable = iterable;
    this.each = each;
  }

  @Override
  public void run(Vertx vertx, AsyncResultHandler<Void> handler) {
    final ObjectWrapper<Boolean> failed = new ObjectWrapper<>(false);
    final ObjectWrapper<Integer> finishedCount = new ObjectWrapper<>(0);

    ArrayList<T> items = new ArrayList<T>();

    for (T item : iterable) {
      items.add(item);
    }

    if (items.size() == 0) {
// Path: src/main/java/org/simondean/vertx/async/DefaultAsyncResult.java
// public class DefaultAsyncResult<T> implements AsyncResult<T> {
//   private Throwable cause;
//   private T result;
// 
//   public DefaultAsyncResult(Throwable cause, T result) {
//     this.cause = cause;
//     this.result = result;
//   }
// 
//   public static <T> AsyncResult<T> succeed(T result) {
//     return new DefaultAsyncResult<>(null, result);
//   }
// 
//   public static AsyncResult<Void> succeed() {
//     return succeed(null);
//   }
// 
//   public static <T> AsyncResult<T> fail(Throwable cause) {
//     if (cause == null) {
//       throw new IllegalArgumentException("cause argument cannot be null");
//     }
// 
//     return new DefaultAsyncResult<>(cause, null);
//   }
// 
//   public static <T> AsyncResult<T> fail(AsyncResult<?> result) {
//     return fail(result.cause());
//   }
// 
//   @Override
//   public T result() {
//     return result;
//   }
// 
//   @Override
//   public Throwable cause() {
//     return cause;
//   }
// 
//   @Override
//   public boolean succeeded() {
//     return cause == null;
//   }
// 
//   @Override
//   public boolean failed() {
//     return cause != null;
//   }
// }
// 
// Path: src/main/java/org/simondean/vertx/async/EachBuilder.java
// public interface EachBuilder {
//   void run(Vertx vertx, AsyncResultHandler<Void> handler);
// }
// 
// Path: src/main/java/org/simondean/vertx/async/ObjectWrapper.java
// public class ObjectWrapper<T> {
//   private T object;
// 
//   public ObjectWrapper() {
//   }
// 
//   public ObjectWrapper(T object) {
//     this.object = object;
//   }
// 
//   public void setObject(T object) {
//     this.object = object;
//   }
// 
//   public T getObject() {
//     return object;
//   }
// }


// Path: src/main/java/org/simondean/vertx/async/internal/EachBuilderImpl.java
import org.simondean.vertx.async.DefaultAsyncResult;
import org.simondean.vertx.async.EachBuilder;
import org.simondean.vertx.async.ObjectWrapper;
import org.vertx.java.core.AsyncResultHandler;
import org.vertx.java.core.Vertx;
import java.util.ArrayList;
import java.util.function.BiConsumer;

package org.simondean.vertx.async.internal;



public class EachBuilderImpl<T> implements EachBuilder {
  private final Iterable<T> iterable;
  private final BiConsumer<T, AsyncResultHandler<Void>> each;

  public EachBuilderImpl(Iterable<T> iterable, BiConsumer<T, AsyncResultHandler<Void>> each) {
    this.iterable = iterable;
    this.each = each;
  }

  @Override
  public void run(Vertx vertx, AsyncResultHandler<Void> handler) {
    final ObjectWrapper<Boolean> failed = new ObjectWrapper<>(false);
    final ObjectWrapper<Integer> finishedCount = new ObjectWrapper<>(0);

    ArrayList<T> items = new ArrayList<T>();

    for (T item : iterable) {
      items.add(item);
    }

    if (items.size() == 0) {
      handler.handle(DefaultAsyncResult.succeed());