// Path: src/main/java/io/dazraf/vertx/consumer/Consumer5.java
// @FunctionalInterface
// public interface Consumer5<T1, T2, T3, T4, T5> extends ConsumerN {
//   void accept(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5);
// }
// 
// Path: src/main/java/io/dazraf/vertx/function/Function5.java
// @FunctionalInterface
// public interface Function5<T1, T2, T3, T4, T5, R> extends FunctionN {
//   R apply(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5);
// }


import io.dazraf.vertx.consumer.Consumer5;
import io.dazraf.vertx.function.Function5;
import io.vertx.core.CompositeFuture;
package io.dazraf.vertx.tuple;


/**
 * A tuple of three values of type {@link T1}, {@link T2} and {@link T3}
 * @param <T1> The type of the first value in the tuple
 * @param <T2> The type of the second value in the tuple
 * @param <T3> The type of the third value in the tuple
 * @param <T4> The type of the fourth value in the tuple
 * @param <T5> The type of the fifth value in the tuple
 */
public class Tuple5<T1, T2, T3, T4, T5> extends Tuple<Tuple5<T1, T2, T3, T4, T5>> {
  private final T1 t1;
  private final T2 t2;
  private final T3 t3;
  private final T4 t4;
  private final T5 t5;

  /**
   * Construct using values for the three types
   *
   * @param t1 the value of the first type
   * @param t2 the value of the second type
   * @param t3 the value of the third type
   * @param t4 the value of the fourth type
   * @param t5 the value of the fifth type
   */
  public Tuple5(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5) {
    this.t1 = t1;
    this.t2 = t2;
    this.t3 = t3;
    this.t4 = t4;
    this.t5 = t5;
  }

  /**
   * Construct from a <i>completed</i> future
   *
   * @param compositeFuture a composite future that should contain three values of types that are assignable to this types generic parameters
   */
  public Tuple5(CompositeFuture compositeFuture) {
    assert (compositeFuture.succeeded());
    this.t1 = compositeFuture.result(0);
    this.t2 = compositeFuture.result(1);
    this.t3 = compositeFuture.result(2);
    this.t4 = compositeFuture.result(3);
    this.t5 = compositeFuture.result(4);
  }

  /**
   * Retrieve the first value
   *
   * @return the value of the first type
   */
  public T1 getT1() {
    return t1;
  }

  /**
   * Retrieve the second value
   *
   * @return the value of the second type
   */
// Path: src/main/java/io/dazraf/vertx/consumer/Consumer5.java
// @FunctionalInterface
// public interface Consumer5<T1, T2, T3, T4, T5> extends ConsumerN {
//   void accept(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5);
// }
// 
// Path: src/main/java/io/dazraf/vertx/function/Function5.java
// @FunctionalInterface
// public interface Function5<T1, T2, T3, T4, T5, R> extends FunctionN {
//   R apply(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5);
// }


// Path: src/main/java/io/dazraf/vertx/tuple/Tuple5.java
import io.dazraf.vertx.consumer.Consumer5;
import io.dazraf.vertx.function.Function5;
import io.vertx.core.CompositeFuture;

package io.dazraf.vertx.tuple;


/**
 * A tuple of three values of type {@link T1}, {@link T2} and {@link T3}
 * @param <T1> The type of the first value in the tuple
 * @param <T2> The type of the second value in the tuple
 * @param <T3> The type of the third value in the tuple
 * @param <T4> The type of the fourth value in the tuple
 * @param <T5> The type of the fifth value in the tuple
 */
public class Tuple5<T1, T2, T3, T4, T5> extends Tuple<Tuple5<T1, T2, T3, T4, T5>> {
  private final T1 t1;
  private final T2 t2;
  private final T3 t3;
  private final T4 t4;
  private final T5 t5;

  /**
   * Construct using values for the three types
   *
   * @param t1 the value of the first type
   * @param t2 the value of the second type
   * @param t3 the value of the third type
   * @param t4 the value of the fourth type
   * @param t5 the value of the fifth type
   */
  public Tuple5(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5) {
    this.t1 = t1;
    this.t2 = t2;
    this.t3 = t3;
    this.t4 = t4;
    this.t5 = t5;
  }

  /**
   * Construct from a <i>completed</i> future
   *
   * @param compositeFuture a composite future that should contain three values of types that are assignable to this types generic parameters
   */
  public Tuple5(CompositeFuture compositeFuture) {
    assert (compositeFuture.succeeded());
    this.t1 = compositeFuture.result(0);
    this.t2 = compositeFuture.result(1);
    this.t3 = compositeFuture.result(2);
    this.t4 = compositeFuture.result(3);
    this.t5 = compositeFuture.result(4);
  }

  /**
   * Retrieve the first value
   *
   * @return the value of the first type
   */
  public T1 getT1() {
    return t1;
  }

  /**
   * Retrieve the second value
   *
   * @return the value of the second type
   */
  public T2 getT2() {