diff --git a/src/func/test_suite.rs b/src/func/test_suite.rs index 751269b..b5357b0 100644 --- a/src/func/test_suite.rs +++ b/src/func/test_suite.rs @@ -57,6 +57,9 @@ pub fn applicative_follows_laws<'a, T: Applicative<'a> + FunctorTestSuite<'a>>() res += tuple_can_be_expressed_via_la2::(|| pa(2), || pb(2)); }) }); + T::sample(|pa| { + res += select_of_equal_is_same::(|| pa(2)); + }); res } diff --git a/src/func/tests.rs b/src/func/tests.rs index c41d6da..94ec8e7 100644 --- a/src/func/tests.rs +++ b/src/func/tests.rs @@ -3,6 +3,7 @@ use std::{ ops::{Add, AddAssign}, }; +use applicative_select::Selected; use controlflow::IterativeWrapped; use super::*; @@ -400,3 +401,19 @@ pub fn iterate_can_be_expressed_via_bind< T::bind(fa0(), f0()), ) } + +pub fn select_of_equal_is_same< + 'a, + T: Applicative<'a> + Eqr<'a>, + A: 'a + Send + Debug + PartialEq, +>( + fa0: impl 'a + Fn() -> T::F, +) -> R { + T::eqr( + "select of equal", + T::fmap(T::select(fa0(), fa0()), |selected| match selected { + Selected::A(a, _) | Selected::B(_, a) => a, + }), + fa0(), + ) +}