1 // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2 // Copyright by contributors to this project.
3 // SPDX-License-Identifier: (Apache-2.0 OR MIT)
4 
5 #[cfg(all(not(mls_build_async), feature = "rayon"))]
6 mod sync_rayon {
7     use rayon::{
8         iter::IterBridge,
9         prelude::{FromParallelIterator, IntoParallelIterator, ParallelBridge, ParallelIterator},
10     };
11 
wrap_iter<I>(it: I) -> I::Iter where I: IntoParallelIterator,12     pub fn wrap_iter<I>(it: I) -> I::Iter
13     where
14         I: IntoParallelIterator,
15     {
16         it.into_par_iter()
17     }
18 
wrap_impl_iter<I>(it: I) -> IterBridge<I::IntoIter> where I: IntoIterator, I::IntoIter: Send, I::Item: Send,19     pub fn wrap_impl_iter<I>(it: I) -> IterBridge<I::IntoIter>
20     where
21         I: IntoIterator,
22         I::IntoIter: Send,
23         I::Item: Send,
24     {
25         it.into_iter().par_bridge()
26     }
27 
28     pub trait ParallelIteratorExt {
29         type Ok: Send;
30         type Error: Send;
31 
try_collect<A>(self) -> Result<A, Self::Error> where A: FromParallelIterator<Self::Ok>32         fn try_collect<A>(self) -> Result<A, Self::Error>
33         where
34             A: FromParallelIterator<Self::Ok>;
35     }
36 
37     impl<I, T, E> ParallelIteratorExt for I
38     where
39         I: ParallelIterator<Item = Result<T, E>>,
40         T: Send,
41         E: Send,
42     {
43         type Ok = T;
44         type Error = E;
45 
try_collect<A>(self) -> Result<A, Self::Error> where A: FromParallelIterator<Self::Ok>,46         fn try_collect<A>(self) -> Result<A, Self::Error>
47         where
48             A: FromParallelIterator<Self::Ok>,
49         {
50             self.collect()
51         }
52     }
53 }
54 
55 #[cfg(all(not(mls_build_async), feature = "rayon"))]
56 pub use sync_rayon::{wrap_impl_iter, wrap_iter, ParallelIteratorExt};
57 
58 #[cfg(not(any(mls_build_async, feature = "rayon")))]
59 mod sync {
wrap_iter<I>(it: I) -> I::IntoIter where I: IntoIterator,60     pub fn wrap_iter<I>(it: I) -> I::IntoIter
61     where
62         I: IntoIterator,
63     {
64         it.into_iter()
65     }
66 
wrap_impl_iter<I>(it: I) -> I::IntoIter where I: IntoIterator,67     pub fn wrap_impl_iter<I>(it: I) -> I::IntoIter
68     where
69         I: IntoIterator,
70     {
71         it.into_iter()
72     }
73 }
74 
75 #[cfg(not(any(mls_build_async, feature = "rayon")))]
76 pub use sync::{wrap_impl_iter, wrap_iter};
77 
78 #[cfg(mls_build_async)]
79 mod async_ {
wrap_iter<I>(it: I) -> futures::stream::Iter<I::IntoIter> where I: IntoIterator,80     pub fn wrap_iter<I>(it: I) -> futures::stream::Iter<I::IntoIter>
81     where
82         I: IntoIterator,
83     {
84         futures::stream::iter(it)
85     }
86 
wrap_impl_iter<I>(it: I) -> futures::stream::Iter<I::IntoIter> where I: IntoIterator,87     pub fn wrap_impl_iter<I>(it: I) -> futures::stream::Iter<I::IntoIter>
88     where
89         I: IntoIterator,
90     {
91         futures::stream::iter(it)
92     }
93 }
94 
95 #[cfg(mls_build_async)]
96 pub use async_::{wrap_impl_iter, wrap_iter};
97