aboutsummaryrefslogtreecommitdiff
path: root/src/external_trait_impls/rayon/helpers.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/external_trait_impls/rayon/helpers.rs')
-rw-r--r--src/external_trait_impls/rayon/helpers.rs26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/external_trait_impls/rayon/helpers.rs b/src/external_trait_impls/rayon/helpers.rs
new file mode 100644
index 0000000..9382007
--- /dev/null
+++ b/src/external_trait_impls/rayon/helpers.rs
@@ -0,0 +1,26 @@
+use alloc::collections::LinkedList;
+use alloc::vec::Vec;
+
+use rayon::iter::{IntoParallelIterator, ParallelIterator};
+
+/// Helper for collecting parallel iterators to an intermediary
+pub(super) fn collect<I: IntoParallelIterator>(iter: I) -> (LinkedList<Vec<I::Item>>, usize) {
+ let list = iter
+ .into_par_iter()
+ .fold(Vec::new, |mut vec, elem| {
+ vec.push(elem);
+ vec
+ })
+ .map(|vec| {
+ let mut list = LinkedList::new();
+ list.push_back(vec);
+ list
+ })
+ .reduce(LinkedList::new, |mut list1, mut list2| {
+ list1.append(&mut list2);
+ list1
+ });
+
+ let len = list.iter().map(Vec::len).sum();
+ (list, len)
+}