package im.actor.runtime.promise; import com.google.j2objc.annotations.ObjectiveCName; import java.util.List; import im.actor.runtime.Log; import im.actor.runtime.function.Consumer; import im.actor.runtime.function.Supplier; import im.actor.runtime.function.Tuple2; import im.actor.runtime.function.Tuple3; import im.actor.runtime.function.Tuple4; /** * Various methods for creating promises. */ public class Promises { @ObjectiveCName("logWithTag:withResolver:withFunc:") public static <T> Promise<T> log(final String TAG, final PromiseResolver<T> resolver, final PromiseFunc<T> func) { return new Promise<T>(r -> func.exec(r)).then(t -> { Log.d(TAG, "Result: " + t); resolver.result(t); }).failure(e -> { Log.d(TAG, "Error: " + e); Log.e(TAG, e); e.printStackTrace(); resolver.error(e); }); } /** * Combines two promises to one with different data types * * @param t1 first argument * @param t2 second argument * @param <T1> first argument type * @param <T2> second argument type * @return promise */ @ObjectiveCName("tupleWithT1:withT2:") public static <T1, T2> Promise<Tuple2<T1, T2>> tuple(Promise<T1> t1, Promise<T2> t2) { return PromisesArray.ofPromises((Promise<Object>) t1, (Promise<Object>) t2) .zip() .map(src -> new Tuple2<>((T1) src.get(0), (T2) src.get(1))); } /** * 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 */ @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))); } /** * Combines four promises to one with different data types * * @param t1 first argument * @param t2 second argument * @param t3 third argument * @param t4 fourth argument * @param <T1> first argument type * @param <T2> second argument type * @param <T3> third argument type * @param <T4> fourth argument type * @return promise */ @ObjectiveCName("tupleWithT1:withT2:withT3:withT4:") public static <T1, T2, T3, T4> Promise<Tuple4<T1, T2, T3, T4>> tuple(Promise<T1> t1, Promise<T2> t2, Promise<T3> t3, Promise<T4> t4) { return PromisesArray.ofPromises((Promise<Object>) t1, (Promise<Object>) t2, (Promise<Object>) t3, (Promise<Object>) t4) .zip() .map(src -> new Tuple4<>((T1) src.get(0), (T2) src.get(1), (T3) src.get(2), (T4) src.get(3))); } /** * Execute promises step by step * * @param queue queue of promises * @param <T> type of promises * @return promise */ public static <T> Promise traverse(List<Supplier<Promise<T>>> queue) { if (queue.size() == 0) { return Promise.success(null); } return queue.remove(0).get() .flatMap(v -> traverse(queue)); } }