use super::*; pub enum Selected<'a, A: 'a, B: 'a, T: ?Sized + WeakFunctorA<'a>> { A(A, T::Fa), B(T::Fa, B), } pub type SelectedWrapped<'a, A, B, T> = Wrap<'a, Selected<'a, A, B, T>, T>; pub trait ApplicativeSelect<'a>: Functor<'a> { fn select(fa: Self::Fa, fb: Self::Fa) -> SelectedWrapped<'a, A, B, Self> { Self::fmap(|a| Selected::A(a, fb), fa) } } pub trait ApplicativeSelectExt<'a>: ApplicativeSelect<'a> { fn select_map( f: impl 'a + FnOnce(Selected<'a, A, B, Self>) -> C, fa: Self::Fa, fb: Self::Fa, ) -> Self::Fa { Self::fmap(f, Self::select(fa, fb)) } } impl<'a, T: ApplicativeSelect<'a>> ApplicativeSelectExt<'a> for T {}