use super::*; pub enum Selected<'a, A: 'a, B: 'a, T: ?Sized + WeakFunctor<'a>> { A(A, T::F), B(T::F, B), } /// See [`ApplicativeSelect::select`]. pub type SelectedWrapped<'a, A, B, T> = Wrap<'a, Selected<'a, A, B, T>, T>; /// Part of [`Applicative`] responsible for choosing the first value. pub trait ApplicativeSelect<'a>: Functor<'a> { fn select(fa: Self::F, fb: Self::F) -> SelectedWrapped<'a, A, B, Self> { Self::fmap(fa, |a| Selected::A(a, fb)) } } pub trait ApplicativeSelectExt<'a>: ApplicativeSelect<'a> { /// Shorthand for [`Functor::fmap`]∘[`ApplicativeSelect::select`]. fn select_map( fa: Self::F, fb: Self::F, f: impl 'a + FnOnce(Selected<'a, A, B, Self>) -> C, ) -> Self::F { Self::fmap(Self::select(fa, fb), f) } } impl<'a, T: ApplicativeSelect<'a>> ApplicativeSelectExt<'a> for T {}