// Path: src/main/java/org/simondean/vertx/async/Async.java
// public final class Async {
//   private Async() {}
// 
//   public static <T> Series<T> series() {
//     return new SeriesImpl<>();
//   }
// 
//   public static WaterfallBuilder waterfall() {
//     return new WaterfallBuilderImpl();
//   }
// 
//   public static <T> IterableBuilder<T> iterable(Iterable<T> iterable) {
//     return new IterableBuilderImpl(iterable);
//   }
// 
//   public static RetryBuilder retry() {
//     return new RetryBuilderImpl();
//   }
// 
//   public static ForeverBuilder forever() {
//     return new ForeverBuilderImpl();
//   }
// }
// 
// 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;
//   }
// }


import org.simondean.vertx.async.Async;
import org.simondean.vertx.async.DefaultAsyncResult;
import org.vertx.java.core.AsyncResultHandler;
import org.vertx.java.core.impl.DefaultFutureResult;
import java.util.List;
        if (result.failed()) {
          handler.handle(DefaultAsyncResult.fail(result));
          return;
        }

        List<String> resultList = result.result();
        doSomethingWithTheResults(resultList);

        handler.handle(DefaultAsyncResult.succeed(resultList));
      });
  }

  private String getSomeResult() {
    return "Result";
  }

  private void someAsyncMethodThatTakesAHandler(AsyncResultHandler<String> handler) {
    if (!succeed) {
      handler.handle(DefaultAsyncResult.fail(new Exception("Fail")));
      return;
    }

    handler.handle(DefaultAsyncResult.succeed("Async result"));
  }

  private void doSomethingWithTheResults(List<String> results) {
    this.results = results;
  }

  public List<String> results() {
// Path: src/main/java/org/simondean/vertx/async/Async.java
// public final class Async {
//   private Async() {}
// 
//   public static <T> Series<T> series() {
//     return new SeriesImpl<>();
//   }
// 
//   public static WaterfallBuilder waterfall() {
//     return new WaterfallBuilderImpl();
//   }
// 
//   public static <T> IterableBuilder<T> iterable(Iterable<T> iterable) {
//     return new IterableBuilderImpl(iterable);
//   }
// 
//   public static RetryBuilder retry() {
//     return new RetryBuilderImpl();
//   }
// 
//   public static ForeverBuilder forever() {
//     return new ForeverBuilderImpl();
//   }
// }
// 
// 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/test/java/org/simondean/vertx/async/unit/examples/SeriesExample.java
import org.simondean.vertx.async.Async;
import org.simondean.vertx.async.DefaultAsyncResult;
import org.vertx.java.core.AsyncResultHandler;
import org.vertx.java.core.impl.DefaultFutureResult;
import java.util.List;

        if (result.failed()) {
          handler.handle(DefaultAsyncResult.fail(result));
          return;
        }

        List<String> resultList = result.result();
        doSomethingWithTheResults(resultList);

        handler.handle(DefaultAsyncResult.succeed(resultList));
      });
  }

  private String getSomeResult() {
    return "Result";
  }

  private void someAsyncMethodThatTakesAHandler(AsyncResultHandler<String> handler) {
    if (!succeed) {
      handler.handle(DefaultAsyncResult.fail(new Exception("Fail")));
      return;
    }

    handler.handle(DefaultAsyncResult.succeed("Async result"));
  }

  private void doSomethingWithTheResults(List<String> results) {
    this.results = results;
  }

  public List<String> results() {
    return results;