radn-rs/src/func/applicative_select.rs
2023-05-22 11:07:16 +00:00

20 lines
443 B
Rust

use super::*;
pub enum Selected<'a, A: 'a, B: 'a, T: ?Sized + 'a + WeakFunctor> {
A(A, T::F<'a, B>),
B(T::F<'a, A>, B),
}
pub trait ApplicativeSelect: Functor {
fn select<'a, A: 'a, B: 'a, C: 'a>(
f: impl 'a + FnOnce(Selected<'a, A, B, Self>) -> C,
fa: Self::F<'a, A>,
fb: Self::F<'a, B>,
) -> Self::F<'a, C>
where
Self: 'a,
{
Self::fmap(|a| f(Selected::A(a, fb)), fa)
}
}