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