use std::fmt::{self, Debug};
use std::marker::PhantomData;
-pub fn try_fold<U, I, ID, F>(base: I, identity: ID, fold_op: F) -> TryFold<I, U, ID, F>
+impl<U, I, ID, F> TryFold<I, U, ID, F>
where
I: ParallelIterator,
F: Fn(U::Ok, I::Item) -> U + Sync + Send,
ID: Fn() -> U::Ok + Sync + Send,
U: Try + Send,
{
- TryFold {
- base: base,
- identity: identity,
- fold_op: fold_op,
- marker: PhantomData,
+ pub(super) fn new(base: I, identity: ID, fold_op: F) -> Self {
+ TryFold {
+ base,
+ identity,
+ fold_op,
+ marker: PhantomData,
+ }
}
}
}
impl<U, I: ParallelIterator + Debug, ID, F> Debug for TryFold<I, U, ID, F> {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("TryFold").field("base", &self.base).finish()
}
}
{
type Result = C::Result;
- fn consume(self, item: T) -> Self {
+ fn consume(mut self, item: T) -> Self {
let fold_op = self.fold_op;
- let result = self.result.and_then(|acc| fold_op(acc, item).into_result());
- TryFoldFolder {
- result: result,
- ..self
+ if let Ok(acc) = self.result {
+ self.result = fold_op(acc, item).into_result();
}
+ self
}
fn complete(self) -> C::Result {
// ///////////////////////////////////////////////////////////////////////////
-pub fn try_fold_with<U, I, F>(base: I, item: U::Ok, fold_op: F) -> TryFoldWith<I, U, F>
+impl<U, I, F> TryFoldWith<I, U, F>
where
I: ParallelIterator,
F: Fn(U::Ok, I::Item) -> U + Sync,
U: Try + Send,
U::Ok: Clone + Send,
{
- TryFoldWith {
- base: base,
- item: item,
- fold_op: fold_op,
+ pub(super) fn new(base: I, item: U::Ok, fold_op: F) -> Self {
+ TryFoldWith {
+ base,
+ item,
+ fold_op,
+ }
}
}
where
U::Ok: Debug,
{
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("TryFoldWith")
.field("base", &self.base)
.field("item", &self.item)