diff --git a/radn-derive/src/lib.rs b/radn-derive/src/lib.rs index 3a1ee85..83e3ba4 100644 --- a/radn-derive/src/lib.rs +++ b/radn-derive/src/lib.rs @@ -1,26 +1,26 @@ use quote::quote; use syn::{parse_macro_input, parse_quote, DeriveInput, GenericParam, Generics}; -#[proc_macro_derive(SharedFunctor)] +#[proc_macro_derive(SharedFunctorAny)] pub fn derive_shared_functor(input: proc_macro::TokenStream) -> proc_macro::TokenStream { let input = parse_macro_input!(input as DeriveInput); let name = input.ident; let generics = add_clone_bounds(input.generics); let (impl_generics, ty_generics, where_clause) = generics.split_for_impl(); let expanded = quote! { - impl #impl_generics SharedFunctor for #name #ty_generics #where_clause { - type Shared<'a, A: 'a + Clone> = Self::F<'a, A> + impl #impl_generics SharedFunctorAny for #name #ty_generics #where_clause { + type SharedAny<'a, A: 'a + Clone> = Self::F<'a, A> where Self: 'a; - fn share<'a, A: 'a + Clone>(fa: Self::F<'a, A>) -> Self::Shared<'a, A> + fn share<'a, A: 'a + Clone>(fa: Self::F<'a, A>) -> Self::SharedAny<'a, A> where Self: 'a, { fa } - fn unshare<'a, A: 'a + Clone>(sa: Self::Shared<'a, A>) -> Self::F<'a, A> + fn unshare<'a, A: 'a + Clone>(sa: Self::SharedAny<'a, A>) -> Self::F<'a, A> where Self: 'a, { diff --git a/src/func.rs b/src/func.rs index fe464b6..95213b3 100644 --- a/src/func.rs +++ b/src/func.rs @@ -21,7 +21,7 @@ pub mod tests; pub use std::ops::ControlFlow; -pub use radn_derive::SharedFunctor; +pub use radn_derive::SharedFunctorAny; pub use self::applicative_select::{ ApplicativeSelect, ApplicativeSelectExt, Selected, SelectedWrapped, @@ -268,24 +268,36 @@ pub trait MonadFailAnyExt<'a>: MonadFailAny<'a> { impl<'a, Fallible: ?Sized + MonadFailAny<'a>> MonadFailAnyExt<'a> for Fallible {} -pub trait SharedFunctor: WeakFunctor { - type Shared<'a, A: 'a + Clone>: 'a + Clone +pub trait SharedFunctorAny: WeakFunctor { + type SharedAny<'a, A: 'a + Clone>: 'a + Clone where Self: 'a; - fn share<'a, A: 'a + Clone>(fa: Self::F<'a, A>) -> Self::Shared<'a, A> + fn share<'a, A: 'a + Clone>(fa: Self::F<'a, A>) -> Self::SharedAny<'a, A> where Self: 'a; - fn unshare<'a, A: 'a + Clone>(sa: Self::Shared<'a, A>) -> Self::F<'a, A> + fn unshare<'a, A: 'a + Clone>(sa: Self::SharedAny<'a, A>) -> Self::F<'a, A> where Self: 'a; } -pub trait SharedFunctorA<'a>: WeakFunctorA<'a> { - type SharedA: 'a + Clone; +pub trait SharedFunctor<'a>: WeakFunctorA<'a> { + type Shared: 'a + Clone; - fn share(fa: Self::Fa) -> Self::SharedA; + fn share(fa: Self::Fa) -> Self::Shared; - fn unshare(sa: Self::SharedA) -> Self::Fa; + fn unshare(sa: Self::Shared) -> Self::Fa; +} + +impl<'a, T: 'a + SharedFunctorAny> SharedFunctor<'a> for T { + type Shared = T::SharedAny<'a, A>; + + fn share(fa: Self::Fa) -> Self::Shared { + T::share(fa) + } + + fn unshare(sa: Self::Shared) -> Self::Fa { + T::unshare(sa) + } } diff --git a/src/func/instances/composition.rs b/src/func/instances/composition.rs index b447206..494ce52 100644 --- a/src/func/instances/composition.rs +++ b/src/func/instances/composition.rs @@ -136,16 +136,16 @@ impl<'a, U: LocalFunctor<'a> + Functor<'a>, V: LocalFunctor<'a>> LocalFunctor<'a } } -impl<'a, U: SharedFunctorA<'a> + Functor<'a>, V: SharedFunctorA<'a>> SharedFunctorA<'a> +impl<'a, U: SharedFunctor<'a> + Functor<'a>, V: SharedFunctor<'a>> SharedFunctor<'a> for CompositionInstance { - type SharedA = U::SharedA>; + type Shared = U::Shared>; - fn share(fa: Self::Fa) -> Self::SharedA { + fn share(fa: Self::Fa) -> Self::Shared { U::share(U::fmap(V::share, fa)) } - fn unshare(sa: Self::SharedA) -> Self::Fa { + fn unshare(sa: Self::Shared) -> Self::Fa { U::fmap(V::unshare, U::unshare(sa)) } } diff --git a/src/func/instances/effect.rs b/src/func/instances/effect.rs index 3053e97..3e47f5e 100644 --- a/src/func/instances/effect.rs +++ b/src/func/instances/effect.rs @@ -23,7 +23,7 @@ impl WithEffect { } } -#[derive(SharedFunctor)] +#[derive(SharedFunctorAny)] pub struct EffectInstance(E); impl WeakFunctor for EffectInstance { diff --git a/src/func/instances/future.rs b/src/func/instances/future.rs index e1bb221..4f9fdae 100644 --- a/src/func/instances/future.rs +++ b/src/func/instances/future.rs @@ -107,14 +107,14 @@ impl<'a> Monad<'a> for FutureInstance { } } -impl<'a> SharedFunctorA<'a> for FutureInstance { - type SharedA = Shared>>>; +impl<'a> SharedFunctor<'a> for FutureInstance { + type Shared = Shared>>>; - fn share(fa: Self::Fa) -> Self::SharedA { + fn share(fa: Self::Fa) -> Self::Shared { fa.shared() } - fn unshare(sa: Self::SharedA) -> Self::Fa { + fn unshare(sa: Self::Shared) -> Self::Fa { Box::pin(sa) } } diff --git a/src/func/instances/lazy.rs b/src/func/instances/lazy.rs index 5927ba2..840fcbf 100644 --- a/src/func/instances/lazy.rs +++ b/src/func/instances/lazy.rs @@ -103,14 +103,14 @@ fn unshare<'a, A: 'a + Clone>(shared: &mut Option A>>) a } -impl<'a> SharedFunctorA<'a> for LazyInstance { - type SharedA = Rc A>>>>; +impl<'a> SharedFunctor<'a> for LazyInstance { + type Shared = Rc A>>>>; - fn share(fa: Self::Fa) -> Self::SharedA { + fn share(fa: Self::Fa) -> Self::Shared { Rc::new(RefCell::new(Some(fa))) } - fn unshare(sa: Self::SharedA) -> Self::Fa { + fn unshare(sa: Self::Shared) -> Self::Fa { Box::new(move || unshare(&mut *sa.borrow_mut())) } } diff --git a/src/func/instances/option.rs b/src/func/instances/option.rs index f455eb5..a3d9c7b 100644 --- a/src/func/instances/option.rs +++ b/src/func/instances/option.rs @@ -9,7 +9,7 @@ use crate::func::*; -#[derive(SharedFunctor)] +#[derive(SharedFunctorAny)] pub struct OptionInstance; impl WeakFunctor for OptionInstance { diff --git a/src/func/instances/overload.rs b/src/func/instances/overload.rs index 15ccb99..599541f 100644 --- a/src/func/instances/overload.rs +++ b/src/func/instances/overload.rs @@ -194,16 +194,16 @@ impl<'a, Ex: 'a, Fallible: MonadFailAny<'a>> MonadFailAny<'a> for DeriveFailAny< } } -impl<'a, T: SharedFunctorA<'a>, O: 'a + DeriveWeakFunctor> SharedFunctorA<'a> +impl<'a, T: SharedFunctor<'a>, O: 'a + DeriveWeakFunctor> SharedFunctor<'a> for OverloadInstance { - type SharedA = T::SharedA; + type Shared = T::Shared; - fn share(fa: Self::Fa) -> Self::SharedA { + fn share(fa: Self::Fa) -> Self::Shared { T::share(fa) } - fn unshare(sa: Self::SharedA) -> Self::Fa { + fn unshare(sa: Self::Shared) -> Self::Fa { T::unshare(sa) } } diff --git a/src/func/instances/result.rs b/src/func/instances/result.rs index 0943255..3af93aa 100644 --- a/src/func/instances/result.rs +++ b/src/func/instances/result.rs @@ -9,7 +9,7 @@ use crate::func::*; -#[derive(SharedFunctor)] +#[derive(SharedFunctorAny)] pub struct ResultInstance(E); impl WeakFunctor for ResultInstance { diff --git a/src/func/instances/solo.rs b/src/func/instances/solo.rs index d52b2aa..2f19cc9 100644 --- a/src/func/instances/solo.rs +++ b/src/func/instances/solo.rs @@ -4,7 +4,7 @@ use crate::func::*; -#[derive(SharedFunctor)] +#[derive(SharedFunctorAny)] pub struct SoloInstance; impl WeakFunctor for SoloInstance { diff --git a/src/func/instances/tryfuture.rs b/src/func/instances/tryfuture.rs index 5d69dc0..30dac46 100644 --- a/src/func/instances/tryfuture.rs +++ b/src/func/instances/tryfuture.rs @@ -104,14 +104,14 @@ impl<'a, E: 'a> Monad<'a> for TryFutureInstance { } } -impl<'a, E: 'a + Clone> SharedFunctorA<'a> for TryFutureInstance { - type SharedA = Shared>>>>; +impl<'a, E: 'a + Clone> SharedFunctor<'a> for TryFutureInstance { + type Shared = Shared>>>>; - fn share(fa: Self::Fa) -> Self::SharedA { + fn share(fa: Self::Fa) -> Self::Shared { fa.shared() } - fn unshare(sa: Self::SharedA) -> Self::Fa { + fn unshare(sa: Self::Shared) -> Self::Fa { Box::pin(sa) } }