| // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. |
| // Copyright by contributors to this project. |
| // SPDX-License-Identifier: (Apache-2.0 OR MIT) |
| |
| #[cfg(all(not(mls_build_async), feature = "rayon"))] |
| mod sync_rayon { |
| use rayon::{ |
| iter::IterBridge, |
| prelude::{FromParallelIterator, IntoParallelIterator, ParallelBridge, ParallelIterator}, |
| }; |
| |
| pub fn wrap_iter<I>(it: I) -> I::Iter |
| where |
| I: IntoParallelIterator, |
| { |
| it.into_par_iter() |
| } |
| |
| pub fn wrap_impl_iter<I>(it: I) -> IterBridge<I::IntoIter> |
| where |
| I: IntoIterator, |
| I::IntoIter: Send, |
| I::Item: Send, |
| { |
| it.into_iter().par_bridge() |
| } |
| |
| pub trait ParallelIteratorExt { |
| type Ok: Send; |
| type Error: Send; |
| |
| fn try_collect<A>(self) -> Result<A, Self::Error> |
| where |
| A: FromParallelIterator<Self::Ok>; |
| } |
| |
| impl<I, T, E> ParallelIteratorExt for I |
| where |
| I: ParallelIterator<Item = Result<T, E>>, |
| T: Send, |
| E: Send, |
| { |
| type Ok = T; |
| type Error = E; |
| |
| fn try_collect<A>(self) -> Result<A, Self::Error> |
| where |
| A: FromParallelIterator<Self::Ok>, |
| { |
| self.collect() |
| } |
| } |
| } |
| |
| #[cfg(all(not(mls_build_async), feature = "rayon"))] |
| pub use sync_rayon::{wrap_impl_iter, wrap_iter, ParallelIteratorExt}; |
| |
| #[cfg(not(any(mls_build_async, feature = "rayon")))] |
| mod sync { |
| pub fn wrap_iter<I>(it: I) -> I::IntoIter |
| where |
| I: IntoIterator, |
| { |
| it.into_iter() |
| } |
| |
| pub fn wrap_impl_iter<I>(it: I) -> I::IntoIter |
| where |
| I: IntoIterator, |
| { |
| it.into_iter() |
| } |
| } |
| |
| #[cfg(not(any(mls_build_async, feature = "rayon")))] |
| pub use sync::{wrap_impl_iter, wrap_iter}; |
| |
| #[cfg(mls_build_async)] |
| mod async_ { |
| pub fn wrap_iter<I>(it: I) -> futures::stream::Iter<I::IntoIter> |
| where |
| I: IntoIterator, |
| { |
| futures::stream::iter(it) |
| } |
| |
| pub fn wrap_impl_iter<I>(it: I) -> futures::stream::Iter<I::IntoIter> |
| where |
| I: IntoIterator, |
| { |
| futures::stream::iter(it) |
| } |
| } |
| |
| #[cfg(mls_build_async)] |
| pub use async_::{wrap_impl_iter, wrap_iter}; |