select_map reorder

This commit is contained in:
AF 2023-05-29 23:52:57 +00:00
parent f5cbf65df9
commit d6231a26a6
3 changed files with 14 additions and 22 deletions

View File

@ -56,17 +56,13 @@ trait SpeculativeFailImpl<'a>: MonadFailAny<'a> {
Self::stuff(<<Self as MonadFailAny>::T as Monad>::join( Self::stuff(<<Self as MonadFailAny>::T as Monad>::join(
<<Self as MonadFailAny>::T as Functor>::fmap( <<Self as MonadFailAny>::T as Functor>::fmap(
Self::unstuff, Self::unstuff,
Self::T::select_map( Self::T::select_map(Self::unstuff(wa), frwb, |selected| match selected {
|selected| match selected {
Selected::A(ra, frwb) => Self::_speculative_ra_frwb(ra, frwb), Selected::A(ra, frwb) => Self::_speculative_ra_frwb(ra, frwb),
Selected::B(fra, Ok(wb)) => { Selected::B(fra, Ok(wb)) => {
Self::map_err(Self::_speculative_fra_wb(fra, wb), Ok) Self::map_err(Self::_speculative_fra_wb(fra, wb), Ok)
} }
Selected::B(_, Err(e1)) => Self::fail(Err(e1)), Selected::B(_, Err(e1)) => Self::fail(Err(e1)),
}, }),
Self::unstuff(wa),
frwb,
),
), ),
)) ))
} }
@ -88,14 +84,14 @@ trait SpeculativeFailImpl<'a>: MonadFailAny<'a> {
Self::stuff(<Self::T as Monad>::join(<Self::T as Functor>::fmap( Self::stuff(<Self::T as Monad>::join(<Self::T as Functor>::fmap(
Self::unstuff, Self::unstuff,
Self::T::select_map( Self::T::select_map(
Self::unstuff(wwa),
Self::unstuff(wwb),
|selected| match selected { |selected| match selected {
Selected::A(Ok(wa), frwb) => Self::_speculative_wa_frwb(wa, frwb), Selected::A(Ok(wa), frwb) => Self::_speculative_wa_frwb(wa, frwb),
Selected::A(Err(e1), _) => Self::fail(Err(e1)), Selected::A(Err(e1), _) => Self::fail(Err(e1)),
Selected::B(frwa, Ok(wb)) => Self::_speculative_frwa_wb(frwa, wb), Selected::B(frwa, Ok(wb)) => Self::_speculative_frwa_wb(frwa, wb),
Selected::B(_, Err(e1)) => Self::fail(Err(e1)), Selected::B(_, Err(e1)) => Self::fail(Err(e1)),
}, },
Self::unstuff(wwa),
Self::unstuff(wwb),
), ),
))) )))
} }

View File

@ -18,9 +18,9 @@ pub trait ApplicativeSelect<'a>: Functor<'a> {
pub trait ApplicativeSelectExt<'a>: ApplicativeSelect<'a> { pub trait ApplicativeSelectExt<'a>: ApplicativeSelect<'a> {
/// Shorthand for [`Functor::fmap`]&#8728;[`ApplicativeSelect::select`]. /// Shorthand for [`Functor::fmap`]&#8728;[`ApplicativeSelect::select`].
fn select_map<A: 'a, B: 'a, C: 'a>( fn select_map<A: 'a, B: 'a, C: 'a>(
f: impl 'a + FnOnce(Selected<'a, A, B, Self>) -> C,
fa: Self::F<A>, fa: Self::F<A>,
fb: Self::F<B>, fb: Self::F<B>,
f: impl 'a + FnOnce(Selected<'a, A, B, Self>) -> C,
) -> Self::F<C> { ) -> Self::F<C> {
Self::fmap(f, Self::select(fa, fb)) Self::fmap(f, Self::select(fa, fb))
} }

View File

@ -76,14 +76,10 @@ impl<'a, T: ApplicativeSelect<'a>, O: 'a + DeriveApplicative> ApplicativeSelect<
for OverloadInstance<T, O> for OverloadInstance<T, O>
{ {
fn select<A: 'a, B: 'a>(fa: Self::F<A>, fb: Self::F<B>) -> SelectedWrapped<'a, A, B, Self> { fn select<A: 'a, B: 'a>(fa: Self::F<A>, fb: Self::F<B>) -> SelectedWrapped<'a, A, B, Self> {
T::select_map( T::select_map(fa, fb, |selected| match selected {
|selected| match selected {
Selected::A(a, fb) => Selected::A(a, fb), Selected::A(a, fb) => Selected::A(a, fb),
Selected::B(fa, b) => Selected::B(fa, b), Selected::B(fa, b) => Selected::B(fa, b),
}, })
fa,
fb,
)
} }
} }