// 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/FunctionWrapper.java
// public class FunctionWrapper<T> {
//   private T f;
// 
//   public void wrap(T f) {
//     this.f = f;
//   }
// 
//   public T f() {
//     return f;
//   }
// }
// 
// Path: src/main/java/org/simondean/vertx/async/Series.java
// public interface Series<T> {
//   Series<T> task(Consumer<AsyncResultHandler<T>> task);
// 
//   void run(AsyncResultHandler<List<T>> handler);
// }


import org.simondean.vertx.async.DefaultAsyncResult;
import org.simondean.vertx.async.FunctionWrapper;
import org.simondean.vertx.async.Series;
import org.vertx.java.core.AsyncResultHandler;
import org.vertx.java.core.impl.DefaultFutureResult;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.function.Consumer;

package org.simondean.vertx.async.internal;



public class SeriesImpl<T> implements Series<T> {
  private ArrayList<Consumer<AsyncResultHandler<T>>> tasks = new ArrayList<>();

  @Override
  public Series<T> task(Consumer<AsyncResultHandler<T>> task) {
    tasks.add(task);
    return this;
  }

  @Override
  public void run(AsyncResultHandler<List<T>> handler) {
    Iterator<Consumer<AsyncResultHandler<T>>> iterator = tasks.iterator();
    List<T> results = new ArrayList<>();

// 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/FunctionWrapper.java
// public class FunctionWrapper<T> {
//   private T f;
// 
//   public void wrap(T f) {
//     this.f = f;
//   }
// 
//   public T f() {
//     return f;
//   }
// }
// 
// Path: src/main/java/org/simondean/vertx/async/Series.java
// public interface Series<T> {
//   Series<T> task(Consumer<AsyncResultHandler<T>> task);
// 
//   void run(AsyncResultHandler<List<T>> handler);
// }


// Path: src/main/java/org/simondean/vertx/async/internal/SeriesImpl.java
import org.simondean.vertx.async.DefaultAsyncResult;
import org.simondean.vertx.async.FunctionWrapper;
import org.simondean.vertx.async.Series;
import org.vertx.java.core.AsyncResultHandler;
import org.vertx.java.core.impl.DefaultFutureResult;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.function.Consumer;


package org.simondean.vertx.async.internal;



public class SeriesImpl<T> implements Series<T> {
  private ArrayList<Consumer<AsyncResultHandler<T>>> tasks = new ArrayList<>();

  @Override
  public Series<T> task(Consumer<AsyncResultHandler<T>> task) {
    tasks.add(task);
    return this;
  }

  @Override
  public void run(AsyncResultHandler<List<T>> handler) {
    Iterator<Consumer<AsyncResultHandler<T>>> iterator = tasks.iterator();
    List<T> results = new ArrayList<>();

    FunctionWrapper<Runnable> visitor = new FunctionWrapper<>();