pub trait SendRefFoldable: Kind_cdc7cd43dac7585f {
// Provided methods
fn send_ref_fold_map<'a, FnBrand, A: Send + Sync + 'a + Clone, M>(
func: impl Fn(&A) -> M + Send + Sync + 'a,
fa: &<Self as Kind_cdc7cd43dac7585f>::Of<'a, A>,
) -> M
where FnBrand: SendLiftFn + 'a,
M: Monoid + Send + Sync + 'a { ... }
fn send_ref_fold_right<'a, FnBrand, A: Send + Sync + 'a + Clone, B: Send + Sync + 'a>(
func: impl Fn(&A, B) -> B + Send + Sync + 'a,
initial: B,
fa: &<Self as Kind_cdc7cd43dac7585f>::Of<'a, A>,
) -> B
where FnBrand: SendLiftFn + 'a { ... }
fn send_ref_fold_left<'a, FnBrand, A: Send + Sync + 'a + Clone, B: Send + Sync + 'a>(
func: impl Fn(B, &A) -> B + Send + Sync + 'a,
initial: B,
fa: &<Self as Kind_cdc7cd43dac7585f>::Of<'a, A>,
) -> B
where FnBrand: SendLiftFn + 'a { ... }
}Expand description
Thread-safe by-reference folding over a structure.
Similar to RefFoldable, but closures and elements must be Send + Sync.
Unlike ParRefFunctor (which requires
RefFunctor as a supertrait), SendRefFoldable
does not require RefFoldable. This is because the SendRef monadic traits
(functor, pointed, lift, applicative) construct new containers internally,
and ArcLazy::new requires Send on closures, which Ref trait signatures
do not guarantee. The SendRef and Ref hierarchies are therefore independent.
All three methods (send_ref_fold_map, send_ref_fold_right, send_ref_fold_left)
have default implementations in terms of each other, so implementors
only need to provide one.
Provided Methods§
Sourcefn send_ref_fold_map<'a, FnBrand, A: Send + Sync + 'a + Clone, M>(
func: impl Fn(&A) -> M + Send + Sync + 'a,
fa: &<Self as Kind_cdc7cd43dac7585f>::Of<'a, A>,
) -> M
fn send_ref_fold_map<'a, FnBrand, A: Send + Sync + 'a + Clone, M>( func: impl Fn(&A) -> M + Send + Sync + 'a, fa: &<Self as Kind_cdc7cd43dac7585f>::Of<'a, A>, ) -> M
Maps values to a monoid by reference and combines them (thread-safe).
§Type Signature
forall A M. (SendLiftFn FnBrand, Monoid M) => (&A -> M, &Self A) -> M
§Type Parameters
'a: The lifetime of the elements.FnBrand: The brand of the cloneable function to use.A: The type of the elements.M: The monoid type.
§Parameters
func: The function to map each element reference to a monoid. Must beSend + Sync.fa: The structure to fold.
§Returns
The combined monoid value.
§Examples
use fp_library::{
brands::*,
classes::send_ref_foldable::*,
types::*,
};
let lazy = ArcLazy::new(|| 5);
let result = send_ref_fold_map::<ArcFnBrand, LazyBrand<ArcLazyConfig>, _, _>(
|a: &i32| a.to_string(),
&lazy,
);
assert_eq!(result, "5");Sourcefn send_ref_fold_right<'a, FnBrand, A: Send + Sync + 'a + Clone, B: Send + Sync + 'a>(
func: impl Fn(&A, B) -> B + Send + Sync + 'a,
initial: B,
fa: &<Self as Kind_cdc7cd43dac7585f>::Of<'a, A>,
) -> Bwhere
FnBrand: SendLiftFn + 'a,
fn send_ref_fold_right<'a, FnBrand, A: Send + Sync + 'a + Clone, B: Send + Sync + 'a>(
func: impl Fn(&A, B) -> B + Send + Sync + 'a,
initial: B,
fa: &<Self as Kind_cdc7cd43dac7585f>::Of<'a, A>,
) -> Bwhere
FnBrand: SendLiftFn + 'a,
Folds the structure from the right by reference (thread-safe).
§Type Signature
forall A B. SendLiftFn FnBrand => ((&A, B) -> B, B, &Self A) -> B
§Type Parameters
'a: The lifetime of the elements.FnBrand: The brand of the cloneable function to use.A: The type of the elements.B: The type of the accumulator.
§Parameters
func: The function to apply to each element reference and accumulator. Must beSend + Sync.initial: The initial value of the accumulator.fa: The structure to fold.
§Returns
The final accumulator value.
§Examples
use fp_library::{
brands::*,
classes::send_ref_foldable::SendRefFoldable,
types::*,
};
let lazy = ArcLazy::new(|| 10);
let result = <LazyBrand<ArcLazyConfig> as SendRefFoldable>::send_ref_fold_right::<
ArcFnBrand,
_,
_,
>(|a: &i32, acc: i32| acc + *a, 0, &lazy);
assert_eq!(result, 10);Sourcefn send_ref_fold_left<'a, FnBrand, A: Send + Sync + 'a + Clone, B: Send + Sync + 'a>(
func: impl Fn(B, &A) -> B + Send + Sync + 'a,
initial: B,
fa: &<Self as Kind_cdc7cd43dac7585f>::Of<'a, A>,
) -> Bwhere
FnBrand: SendLiftFn + 'a,
fn send_ref_fold_left<'a, FnBrand, A: Send + Sync + 'a + Clone, B: Send + Sync + 'a>(
func: impl Fn(B, &A) -> B + Send + Sync + 'a,
initial: B,
fa: &<Self as Kind_cdc7cd43dac7585f>::Of<'a, A>,
) -> Bwhere
FnBrand: SendLiftFn + 'a,
Folds the structure from the left by reference (thread-safe).
§Type Signature
forall A B. SendLiftFn FnBrand => ((B, &A) -> B, B, &Self A) -> B
§Type Parameters
'a: The lifetime of the elements.FnBrand: The brand of the cloneable function to use.A: The type of the elements.B: The type of the accumulator.
§Parameters
func: The function to apply to the accumulator and each element reference. Must beSend + Sync.initial: The initial value of the accumulator.fa: The structure to fold.
§Returns
The final accumulator value.
§Examples
use fp_library::{
brands::*,
classes::send_ref_foldable::SendRefFoldable,
types::*,
};
let lazy = ArcLazy::new(|| 10);
let result = <LazyBrand<ArcLazyConfig> as SendRefFoldable>::send_ref_fold_left::<
ArcFnBrand,
_,
_,
>(|acc: i32, a: &i32| acc + *a, 0, &lazy);
assert_eq!(result, 10);Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.