code: @ObjectiveCName("tupleWithT1:withT2:withT3:")
      public static <T1, T2, T3> Promise<Tuple3<T1, T2, T3>> tuple(Promise<T1> t1, Promise<T2> t2, Promise<T3> t3) {
          return PromisesArray.ofPromises((Promise<Object>) t1, (Promise<Object>) t2, (Promise<Object>) t3)
                  .zip()
                  .map(src -> new Tuple3<>((T1) src.get(0), (T2) src.get(1), (T3) src.get(3)));
      }
docs: Combines tree promises to one with different data types
  
  @param t1   first argument
  @param t2   second argument
  @param t3   third argument
  @param <T1> first argument type
  @param <T2> second argument type
  @param <T3> third argument type
  @return promise