]> nmode's Git Repositories - signal-cli/blobdiff - lib/src/main/java/org/asamk/signal/manager/util/Utils.java
Paralellize profile fetching
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / util / Utils.java
index 60e0c3a4bbcf0e42e92461e519ca69f799e2a4f9..05de2c862de5e1abcf277cdf875341c56715b3fa 100644 (file)
@@ -16,6 +16,12 @@ import java.io.InputStream;
 import java.net.URLConnection;
 import java.nio.file.Files;
 import java.util.Locale;
+import java.util.Spliterator;
+import java.util.Spliterators;
+import java.util.function.BiFunction;
+import java.util.function.Consumer;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
 
 public class Utils {
 
@@ -88,4 +94,16 @@ public class Utils {
 
         return locale;
     }
+
+    public static <L, R, T> Stream<T> zip(Stream<L> leftStream, Stream<R> rightStream, BiFunction<L, R, T> combiner) {
+        Spliterator<L> lefts = leftStream.spliterator();
+        Spliterator<R> rights = rightStream.spliterator();
+        return StreamSupport.stream(new Spliterators.AbstractSpliterator<T>(Long.min(lefts.estimateSize(),
+                rights.estimateSize()), lefts.characteristics() & rights.characteristics()) {
+            @Override
+            public boolean tryAdvance(Consumer<? super T> action) {
+                return lefts.tryAdvance(left -> rights.tryAdvance(right -> action.accept(combiner.apply(left, right))));
+            }
+        }, leftStream.isParallel() || rightStream.isParallel());
+    }
 }