#[fp_macros::document_module]
pub(crate) mod inner {
use {
crate::{
classes::{
Applicative,
Bitraversable,
LiftFn,
RefBitraversable,
},
dispatch::{
Ref,
Val,
},
kinds::*,
},
fp_macros::*,
};
#[document_type_parameters(
"The lifetime of the values.",
"The brand of the cloneable function to use.",
"The brand of the bitraversable structure.",
"The type of the first-position elements.",
"The type of the second-position elements.",
"The output type for first-position elements.",
"The output type for second-position elements.",
"The applicative functor brand for the computation.",
"The container type (owned or borrowed), inferred from the argument.",
"Dispatch marker type, inferred automatically."
)]
#[document_parameters("The closure tuple implementing this dispatch.")]
pub trait BiTraverseDispatch<
'a,
FnBrand,
Brand: Kind_266801a817966495,
A: 'a,
B: 'a,
C: 'a,
D: 'a,
F: Kind_cdc7cd43dac7585f,
FA,
Marker,
> {
#[document_signature]
#[document_parameters("The structure to traverse.")]
#[document_returns("The combined result in the applicative context.")]
#[document_examples]
fn dispatch(
self,
fa: FA,
) -> Apply!(<F as Kind!( type Of<'a, T: 'a>: 'a; )>::Of<'a, Apply!(<Brand as Kind!( type Of<'a, A: 'a, B: 'a>: 'a; )>::Of<'a, C, D>)>);
}
#[document_type_parameters(
"The lifetime of the values.",
"The cloneable function brand (unused by Val path).",
"The brand of the bitraversable structure.",
"The first input type.",
"The second input type.",
"The first output type.",
"The second output type.",
"The applicative functor brand.",
"The first closure type.",
"The second closure type."
)]
#[document_parameters("The closure tuple.")]
impl<'a, FnBrand, Brand, A, B, C, D, F, Func1, Func2>
BiTraverseDispatch<
'a,
FnBrand,
Brand,
A,
B,
C,
D,
F,
Apply!(<Brand as Kind!( type Of<'a, A: 'a, B: 'a>: 'a; )>::Of<'a, A, B>),
Val,
> for (Func1, Func2)
where
Brand: Bitraversable,
A: 'a + Clone,
B: 'a + Clone,
C: 'a + Clone,
D: 'a + Clone,
F: Applicative,
Func1: Fn(A) -> Apply!(<F as Kind!( type Of<'a, T: 'a>: 'a; )>::Of<'a, C>) + 'a,
Func2: Fn(B) -> Apply!(<F as Kind!( type Of<'a, T: 'a>: 'a; )>::Of<'a, D>) + 'a,
{
#[document_signature]
#[document_parameters("The structure to traverse.")]
#[document_returns("The combined result in the applicative context.")]
#[document_examples]
fn dispatch(
self,
fa: Apply!(<Brand as Kind!( type Of<'a, A: 'a, B: 'a>: 'a; )>::Of<'a, A, B>),
) -> Apply!(<F as Kind!( type Of<'a, T: 'a>: 'a; )>::Of<'a, Apply!(<Brand as Kind!( type Of<'a, A: 'a, B: 'a>: 'a; )>::Of<'a, C, D>)>)
{
Brand::bi_traverse::<A, B, C, D, F>(self.0, self.1, fa)
}
}
#[document_type_parameters(
"The lifetime of the values.",
"The borrow lifetime.",
"The cloneable function brand.",
"The brand of the bitraversable structure.",
"The first input type.",
"The second input type.",
"The first output type.",
"The second output type.",
"The applicative functor brand.",
"The first closure type.",
"The second closure type."
)]
#[document_parameters("The closure tuple.")]
impl<'a, 'b, FnBrand, Brand, A, B, C, D, F, Func1, Func2>
BiTraverseDispatch<
'a,
FnBrand,
Brand,
A,
B,
C,
D,
F,
&'b Apply!(<Brand as Kind!( type Of<'a, A: 'a, B: 'a>: 'a; )>::Of<'a, A, B>),
Ref,
> for (Func1, Func2)
where
Brand: RefBitraversable,
FnBrand: LiftFn + 'a,
A: 'a + Clone,
B: 'a + Clone,
C: 'a + Clone,
D: 'a + Clone,
F: Applicative,
Func1: Fn(&A) -> Apply!(<F as Kind!( type Of<'a, T: 'a>: 'a; )>::Of<'a, C>) + 'a,
Func2: Fn(&B) -> Apply!(<F as Kind!( type Of<'a, T: 'a>: 'a; )>::Of<'a, D>) + 'a,
Apply!(<Brand as Kind!( type Of<'a, A: 'a, B: 'a>: 'a; )>::Of<'a, C, D>): Clone,
Apply!(<F as Kind!( type Of<'a, T: 'a>: 'a; )>::Of<'a, C>): Clone,
Apply!(<F as Kind!( type Of<'a, T: 'a>: 'a; )>::Of<'a, D>): Clone,
{
#[document_signature]
#[document_parameters("A reference to the structure to traverse.")]
#[document_returns("The combined result in the applicative context.")]
#[document_examples]
fn dispatch(
self,
fa: &'b Apply!(<Brand as Kind!( type Of<'a, A: 'a, B: 'a>: 'a; )>::Of<'a, A, B>),
) -> Apply!(<F as Kind!( type Of<'a, T: 'a>: 'a; )>::Of<'a, Apply!(<Brand as Kind!( type Of<'a, A: 'a, B: 'a>: 'a; )>::Of<'a, C, D>)>)
{
Brand::ref_bi_traverse::<FnBrand, A, B, C, D, F>(self.0, self.1, fa)
}
}
#[document_signature]
#[document_type_parameters(
"The lifetime of the values.",
"The cloneable function brand.",
"The container type (owned or borrowed). Brand is inferred from this.",
"The type of the first element.",
"The type of the second element.",
"The type of the first result.",
"The type of the second result.",
"The applicative effect brand.",
"Dispatch marker type, inferred automatically."
)]
#[document_parameters(
"A tuple of (first traversal function, second traversal function).",
"The bitraversable value (owned for Val, borrowed for Ref)."
)]
#[document_returns("The applicative effect containing the traversed bifunctor.")]
#[document_examples]
pub fn bi_traverse<
'a,
FnBrand,
FA,
A: 'a,
B: 'a,
C: 'a,
D: 'a,
F: Kind_cdc7cd43dac7585f,
Marker,
>(
fg: impl BiTraverseDispatch<
'a,
FnBrand,
<FA as InferableBrand_266801a817966495>::Brand,
A,
B,
C,
D,
F,
FA,
Marker,
>,
fa: FA,
) -> Apply!(<F as Kind!( type Of<'a, T: 'a>: 'a; )>::Of<'a, Apply!(<<FA as InferableBrand!(type Of<'a, A: 'a, B: 'a>: 'a;)>::Brand as Kind!( type Of<'a, A: 'a, B: 'a>: 'a; )>::Of<'a, C, D>)>)
where
FA: InferableBrand_266801a817966495, {
fg.dispatch(fa)
}
pub mod explicit {
use super::*;
#[document_signature]
#[document_type_parameters(
"The lifetime of the values.",
"The brand of the cloneable function to use.",
"The brand of the bitraversable structure.",
"The type of the first-position elements.",
"The type of the second-position elements.",
"The output type for first-position elements.",
"The output type for second-position elements.",
"The applicative functor brand.",
"The container type (owned or borrowed), inferred from the argument.",
"Dispatch marker type, inferred automatically."
)]
#[document_parameters(
"A tuple of (first function, second function), each returning a value in an applicative context.",
"The bitraversable structure (owned for Val, borrowed for Ref)."
)]
#[document_returns("The structure wrapped in the applicative context.")]
#[document_examples]
pub fn bi_traverse<
'a,
FnBrand,
Brand: Kind_266801a817966495,
A: 'a,
B: 'a,
C: 'a,
D: 'a,
F: Kind_cdc7cd43dac7585f,
FA,
Marker,
>(
fg: impl BiTraverseDispatch<'a, FnBrand, Brand, A, B, C, D, F, FA, Marker>,
fa: FA,
) -> Apply!(<F as Kind!( type Of<'a, T: 'a>: 'a; )>::Of<'a, Apply!(<Brand as Kind!( type Of<'a, A: 'a, B: 'a>: 'a; )>::Of<'a, C, D>)>)
{
fg.dispatch(fa)
}
}
}
pub use inner::*;