diff --git a/src/func/copy_func.rs b/src/func/copy_func.rs index 1d63dd5..0a8d8af 100644 --- a/src/func/copy_func.rs +++ b/src/func/copy_func.rs @@ -89,59 +89,59 @@ impl CopyApplicativeLA2 for T { } } -// pub trait CopyApplicative: CopyFunctor + CopyApplicativeSeq + CopyApplicativeLA2 { -// fn copy_pure(a: A) -> Self::CF; +pub trait CopyApplicative: CopyFunctor + CopyApplicativeSeq + CopyApplicativeLA2 { + fn copy_pure<'a, A: 'a + Copy>(a: A) -> Self::CF<'a, A>; -// fn copy_discard_first(fa: Self::CF, fb: Self::CF) -> Self::CF { -// Self::copy_seq(Self::copy_replace(fa, |b| b), fb) -// } + fn copy_discard_first<'a, A: 'a + Copy, B: 'a + Copy>(fa: Self::CF<'a, A>, fb: Self::CF<'a, B>) -> Self::CF<'a, B> { + Self::copy_seq(Self::copy_replace(fa, |b| b), fb) + } -// fn copy_discard_second(fa: Self::CF, fb: Self::CF) -> Self::CF { -// Self::copy_la2(|a, _| a, fa, fb) -// } -// } + fn copy_discard_second<'a, A: 'a + Copy, B: 'a + Copy>(fa: Self::CF<'a, A>, fb: Self::CF<'a, B>) -> Self::CF<'a, A> { + Self::copy_la2(|a, _| a, fa, fb) + } +} -// impl CopyApplicative for T { -// fn copy_pure(a: A) -> Self::CF { -// Self::pure(a) -// } +impl CopyApplicative for T { + fn copy_pure<'a, A: 'a + Copy>(a: A) -> Self::CF<'a, A> { + Self::pure(a) + } -// fn copy_discard_first(fa: Self::CF, fb: Self::CF) -> Self::CF { -// Self::discard_first(fa, fb) -// } + fn copy_discard_first<'a, A: 'a + Copy, B: 'a + Copy>(fa: Self::CF<'a, A>, fb: Self::CF<'a, B>) -> Self::CF<'a, B> { + Self::discard_first(fa, fb) + } -// fn copy_discard_second(fa: Self::CF, fb: Self::CF) -> Self::CF { -// Self::discard_second(fa, fb) -// } -// } + fn copy_discard_second<'a, A: 'a + Copy, B: 'a + Copy>(fa: Self::CF<'a, A>, fb: Self::CF<'a, B>) -> Self::CF<'a, A> { + Self::discard_second(fa, fb) + } +} -// pub trait CopyMonad: CopyApplicative { -// fn copy_bind Self::CF>( -// fa: Self::CF, -// f: F, -// ) -> Self::CF; +pub trait CopyMonad: CopyApplicative { + fn copy_bind<'a, A: 'a + Copy, B: 'a + Copy, F: 'a + Copy + Fn(A) -> Self::CF<'a, B>>( + fa: Self::CF<'a, A>, + f: F, + ) -> Self::CF<'a, B>; -// fn copy_join(ffa: Self::CF>) -> Self::CF -// where -// Self::CF: Copy, -// { -// // ugly -// Self::copy_bind(ffa, |fa| fa) -// } -// } + fn copy_join<'a, A: 'a + Copy>(ffa: Self::CF<'a, Self::CF<'a, A>>) -> Self::CF<'a, A> + where + Self::CF<'a, A>: 'a + Copy, + { + // ugly + Self::copy_bind(ffa, |fa| fa) + } +} -// impl CopyMonad for T { -// fn copy_bind Self::CF>( -// fa: Self::CF, -// f: F, -// ) -> Self::CF { -// T::bind(fa, f) -// } +impl CopyMonad for T { + fn copy_bind<'a, A: 'a + Copy, B: 'a + Copy, F: 'a + Copy + Fn(A) -> Self::CF<'a, B>>( + fa: Self::CF<'a, A>, + f: F, + ) -> Self::CF<'a, B> { + T::bind(fa, f) + } -// fn copy_join(ffa: Self::CF>) -> Self::CF -// where -// Self::CF: Copy, -// { -// T::join(ffa) -// } -// } + fn copy_join<'a, A: 'a + Copy>(ffa: Self::CF<'a, Self::CF<'a, A>>) -> Self::CF<'a, A> + where + Self::CF<'a, A>: 'a + Copy, + { + T::join(ffa) + } +}