simplify select

This commit is contained in:
AF 2023-05-24 06:59:47 +00:00
parent ff3f101f00
commit 258a2c8f80
6 changed files with 24 additions and 29 deletions

View File

@ -23,7 +23,7 @@ pub use std::ops::ControlFlow;
pub use radn_derive::{CovariantFunctor, SharedFunctor}; pub use radn_derive::{CovariantFunctor, SharedFunctor};
pub use self::applicative_select::{ApplicativeSelect, Selected}; pub use self::applicative_select::{ApplicativeSelect, Selected, SelectedWrapped};
use self::controlflow::{BindableMut, ControlFlowInstance}; use self::controlflow::{BindableMut, ControlFlowInstance};
pub use self::controlflow::{Iterative, IterativeWrapped}; pub use self::controlflow::{Iterative, IterativeWrapped};
#[cfg(doc)] #[cfg(doc)]

View File

@ -5,15 +5,16 @@ pub enum Selected<'a, A: 'a, B: 'a, T: ?Sized + 'a + WeakFunctor> {
B(T::F<'a, A>, B), B(T::F<'a, A>, B),
} }
pub type SelectedWrapped<'a, A, B, T> = <T as WeakFunctor>::F<'a, Selected<'a, A, B, T>>;
pub trait ApplicativeSelect: Functor { pub trait ApplicativeSelect: Functor {
fn select<'a, A: 'a, B: 'a, C: 'a>( fn select<'a, A: 'a, B: 'a>(
f: impl 'a + FnOnce(Selected<'a, A, B, Self>) -> C,
fa: Self::F<'a, A>, fa: Self::F<'a, A>,
fb: Self::F<'a, B>, fb: Self::F<'a, B>,
) -> Self::F<'a, C> ) -> SelectedWrapped<'a, A, B, Self>
where where
Self: 'a, Self: 'a,
{ {
Self::fmap(|a| f(Selected::A(a, fb)), fa) Self::fmap(|a| Selected::A(a, fb), fa)
} }
} }

View File

@ -73,21 +73,19 @@ impl<U: ApplicativeTuple, V: ApplicativeTuple> ApplicativeTuple for CompositionI
} }
impl<U: ApplicativeSelect, V: Functor> ApplicativeSelect for CompositionInstance<U, V> { impl<U: ApplicativeSelect, V: Functor> ApplicativeSelect for CompositionInstance<U, V> {
fn select<'a, A: 'a, B: 'a, C: 'a>( fn select<'a, A: 'a, B: 'a>(
f: impl 'a + FnOnce(Selected<'a, A, B, Self>) -> C,
fa: Self::F<'a, A>, fa: Self::F<'a, A>,
fb: Self::F<'a, B>, fb: Self::F<'a, B>,
) -> Self::F<'a, C> ) -> SelectedWrapped<'a, A, B, Self>
where where
Self: 'a, Self: 'a,
{ {
U::select( U::fmap(
|selected| match selected { |selected| match selected {
Selected::A(ua, fb) => V::fmap(|a| f(Selected::A(a, fb)), ua), Selected::A(ua, fb) => V::fmap(|a| Selected::A(a, fb), ua),
Selected::B(fa, ub) => V::fmap(|b| f(Selected::B(fa, b)), ub), Selected::B(fa, ub) => V::fmap(|b| Selected::B(fa, b), ub),
}, },
fa, U::select(fa, fb),
fb,
) )
} }
} }

View File

@ -73,18 +73,17 @@ impl ApplicativeTuple for FutureInstance {
} }
impl ApplicativeSelect for FutureInstance { impl ApplicativeSelect for FutureInstance {
fn select<'a, A: 'a, B: 'a, C: 'a>( fn select<'a, A: 'a, B: 'a>(
f: impl 'a + FnOnce(Selected<'a, A, B, Self>) -> C,
fa: Self::F<'a, A>, fa: Self::F<'a, A>,
fb: Self::F<'a, B>, fb: Self::F<'a, B>,
) -> Self::F<'a, C> ) -> SelectedWrapped<'a, A, B, Self>
where where
Self: 'a, Self: 'a,
{ {
Box::pin(async { Box::pin(async {
match select(fa, fb).await { match select(fa, fb).await {
Either::Left((a, fb)) => f(Selected::A(a, fb)), Either::Left((a, fb)) => Selected::A(a, fb),
Either::Right((b, fa)) => f(Selected::B(fa, b)), Either::Right((b, fa)) => Selected::B(fa, b),
} }
}) })
} }

View File

@ -83,18 +83,17 @@ impl<E> ApplicativeTuple for TryFutureInstance<E> {
} }
impl<E> ApplicativeSelect for TryFutureInstance<E> { impl<E> ApplicativeSelect for TryFutureInstance<E> {
fn select<'a, A: 'a, B: 'a, C: 'a>( fn select<'a, A: 'a, B: 'a>(
f: impl 'a + FnOnce(Selected<'a, A, B, Self>) -> C,
fa: Self::F<'a, A>, fa: Self::F<'a, A>,
fb: Self::F<'a, B>, fb: Self::F<'a, B>,
) -> Self::F<'a, C> ) -> SelectedWrapped<'a, A, B, Self>
where where
Self: 'a, Self: 'a,
{ {
Box::pin(async { Box::pin(async {
match try_select(fa, fb).await { match try_select(fa, fb).await {
Ok(Either::Left((a, fb))) => Ok(f(Selected::A(a, fb))), Ok(Either::Left((a, fb))) => Ok(Selected::A(a, fb)),
Ok(Either::Right((b, fa))) => Ok(f(Selected::B(fa, b))), Ok(Either::Right((b, fa))) => Ok(Selected::B(fa, b)),
Err(Either::Left((e, _))) => Err(e), Err(Either::Left((e, _))) => Err(e),
Err(Either::Right((e, _))) => Err(e), Err(Either::Right((e, _))) => Err(e),
} }

View File

@ -54,7 +54,7 @@ pub trait SpeculativeFail: MonadFailAny {
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 as ApplicativeSelect>::select( <Self::T as Functor>::fmap(
|selected| match selected { |selected| match selected {
Selected::A(a, fwb) => Self::_speculative_a_fwb(a, fwb), Selected::A(a, fwb) => Self::_speculative_a_fwb(a, fwb),
Selected::B(fa, Ok(wb)) => { Selected::B(fa, Ok(wb)) => {
@ -62,8 +62,7 @@ pub trait SpeculativeFail: MonadFailAny {
} }
Selected::B(_, Err(e1)) => Self::fail(Err(e1)), Selected::B(_, Err(e1)) => Self::fail(Err(e1)),
}, },
Self::unstuff(wa), <Self::T as ApplicativeSelect>::select(Self::unstuff(wa), fwb),
fwb,
), ),
), ),
)) ))
@ -91,15 +90,14 @@ pub trait SpeculativeFail: MonadFailAny {
{ {
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 as ApplicativeSelect>::select( <Self::T as Functor>::fmap(
|selected| match selected { |selected| match selected {
Selected::A(Ok(wa), fwb) => Self::_speculative_wa_fwb(wa, fwb), Selected::A(Ok(wa), fwb) => Self::_speculative_wa_fwb(wa, fwb),
Selected::A(Err(e1), _) => Self::fail(Err(e1)), Selected::A(Err(e1), _) => Self::fail(Err(e1)),
Selected::B(fwa, Ok(wb)) => Self::_speculative_fwa_wb(fwa, wb), Selected::B(fwa, Ok(wb)) => Self::_speculative_fwa_wb(fwa, wb),
Selected::B(_, Err(e1)) => Self::fail(Err(e1)), Selected::B(_, Err(e1)) => Self::fail(Err(e1)),
}, },
Self::unstuff(wwa), <Self::T as ApplicativeSelect>::select(Self::unstuff(wwa), Self::unstuff(wwb)),
Self::unstuff(wwb),
), ),
))) )))
} }