| // 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}; |