SharedFunctorAny

This commit is contained in:
AF 2023-05-26 11:14:59 +00:00
parent bff238ff00
commit 1012f9be5e
11 changed files with 50 additions and 38 deletions

View File

@ -1,26 +1,26 @@
use quote::quote; use quote::quote;
use syn::{parse_macro_input, parse_quote, DeriveInput, GenericParam, Generics}; 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 { pub fn derive_shared_functor(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(input as DeriveInput); let input = parse_macro_input!(input as DeriveInput);
let name = input.ident; let name = input.ident;
let generics = add_clone_bounds(input.generics); let generics = add_clone_bounds(input.generics);
let (impl_generics, ty_generics, where_clause) = generics.split_for_impl(); let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
let expanded = quote! { let expanded = quote! {
impl #impl_generics SharedFunctor for #name #ty_generics #where_clause { impl #impl_generics SharedFunctorAny for #name #ty_generics #where_clause {
type Shared<'a, A: 'a + Clone> = Self::F<'a, A> type SharedAny<'a, A: 'a + Clone> = Self::F<'a, A>
where where
Self: 'a; 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 where
Self: 'a, Self: 'a,
{ {
fa 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 where
Self: 'a, Self: 'a,
{ {

View File

@ -21,7 +21,7 @@ pub mod tests;
pub use std::ops::ControlFlow; pub use std::ops::ControlFlow;
pub use radn_derive::SharedFunctor; pub use radn_derive::SharedFunctorAny;
pub use self::applicative_select::{ pub use self::applicative_select::{
ApplicativeSelect, ApplicativeSelectExt, Selected, SelectedWrapped, ApplicativeSelect, ApplicativeSelectExt, Selected, SelectedWrapped,
@ -268,24 +268,36 @@ pub trait MonadFailAnyExt<'a>: MonadFailAny<'a> {
impl<'a, Fallible: ?Sized + MonadFailAny<'a>> MonadFailAnyExt<'a> for Fallible {} impl<'a, Fallible: ?Sized + MonadFailAny<'a>> MonadFailAnyExt<'a> for Fallible {}
pub trait SharedFunctor: WeakFunctor { pub trait SharedFunctorAny: WeakFunctor {
type Shared<'a, A: 'a + Clone>: 'a + Clone type SharedAny<'a, A: 'a + Clone>: 'a + Clone
where where
Self: 'a; 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 where
Self: 'a; 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 where
Self: 'a; Self: 'a;
} }
pub trait SharedFunctorA<'a>: WeakFunctorA<'a> { pub trait SharedFunctor<'a>: WeakFunctorA<'a> {
type SharedA<A: 'a + Clone>: 'a + Clone; type Shared<A: 'a + Clone>: 'a + Clone;
fn share<A: 'a + Clone>(fa: Self::Fa<A>) -> Self::SharedA<A>; fn share<A: 'a + Clone>(fa: Self::Fa<A>) -> Self::Shared<A>;
fn unshare<A: 'a + Clone>(sa: Self::SharedA<A>) -> Self::Fa<A>; fn unshare<A: 'a + Clone>(sa: Self::Shared<A>) -> Self::Fa<A>;
}
impl<'a, T: 'a + SharedFunctorAny> SharedFunctor<'a> for T {
type Shared<A: 'a + Clone> = T::SharedAny<'a, A>;
fn share<A: 'a + Clone>(fa: Self::Fa<A>) -> Self::Shared<A> {
T::share(fa)
}
fn unshare<A: 'a + Clone>(sa: Self::Shared<A>) -> Self::Fa<A> {
T::unshare(sa)
}
} }

View File

@ -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<U, V> for CompositionInstance<U, V>
{ {
type SharedA<A: 'a + Clone> = U::SharedA<V::SharedA<A>>; type Shared<A: 'a + Clone> = U::Shared<V::Shared<A>>;
fn share<A: 'a + Clone>(fa: Self::Fa<A>) -> Self::SharedA<A> { fn share<A: 'a + Clone>(fa: Self::Fa<A>) -> Self::Shared<A> {
U::share(U::fmap(V::share, fa)) U::share(U::fmap(V::share, fa))
} }
fn unshare<A: 'a + Clone>(sa: Self::SharedA<A>) -> Self::Fa<A> { fn unshare<A: 'a + Clone>(sa: Self::Shared<A>) -> Self::Fa<A> {
U::fmap(V::unshare, U::unshare(sa)) U::fmap(V::unshare, U::unshare(sa))
} }
} }

View File

@ -23,7 +23,7 @@ impl<A, E: Effect> WithEffect<A, E> {
} }
} }
#[derive(SharedFunctor)] #[derive(SharedFunctorAny)]
pub struct EffectInstance<E>(E); pub struct EffectInstance<E>(E);
impl<E> WeakFunctor for EffectInstance<E> { impl<E> WeakFunctor for EffectInstance<E> {

View File

@ -107,14 +107,14 @@ impl<'a> Monad<'a> for FutureInstance {
} }
} }
impl<'a> SharedFunctorA<'a> for FutureInstance { impl<'a> SharedFunctor<'a> for FutureInstance {
type SharedA<A: 'a + Clone> = Shared<Pin<Box<dyn 'a + Future<Output = A>>>>; type Shared<A: 'a + Clone> = Shared<Pin<Box<dyn 'a + Future<Output = A>>>>;
fn share<A: 'a + Clone>(fa: Self::Fa<A>) -> Self::SharedA<A> { fn share<A: 'a + Clone>(fa: Self::Fa<A>) -> Self::Shared<A> {
fa.shared() fa.shared()
} }
fn unshare<A: 'a + Clone>(sa: Self::SharedA<A>) -> Self::Fa<A> { fn unshare<A: 'a + Clone>(sa: Self::Shared<A>) -> Self::Fa<A> {
Box::pin(sa) Box::pin(sa)
} }
} }

View File

@ -103,14 +103,14 @@ fn unshare<'a, A: 'a + Clone>(shared: &mut Option<Box<dyn 'a + FnOnce() -> A>>)
a a
} }
impl<'a> SharedFunctorA<'a> for LazyInstance { impl<'a> SharedFunctor<'a> for LazyInstance {
type SharedA<A: 'a + Clone> = Rc<RefCell<Option<Box<dyn 'a + FnOnce() -> A>>>>; type Shared<A: 'a + Clone> = Rc<RefCell<Option<Box<dyn 'a + FnOnce() -> A>>>>;
fn share<A: 'a + Clone>(fa: Self::Fa<A>) -> Self::SharedA<A> { fn share<A: 'a + Clone>(fa: Self::Fa<A>) -> Self::Shared<A> {
Rc::new(RefCell::new(Some(fa))) Rc::new(RefCell::new(Some(fa)))
} }
fn unshare<A: 'a + Clone>(sa: Self::SharedA<A>) -> Self::Fa<A> { fn unshare<A: 'a + Clone>(sa: Self::Shared<A>) -> Self::Fa<A> {
Box::new(move || unshare(&mut *sa.borrow_mut())) Box::new(move || unshare(&mut *sa.borrow_mut()))
} }
} }

View File

@ -9,7 +9,7 @@
use crate::func::*; use crate::func::*;
#[derive(SharedFunctor)] #[derive(SharedFunctorAny)]
pub struct OptionInstance; pub struct OptionInstance;
impl WeakFunctor for OptionInstance { impl WeakFunctor for OptionInstance {

View File

@ -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<T, O> for OverloadInstance<T, O>
{ {
type SharedA<A: 'a + Clone> = T::SharedA<A>; type Shared<A: 'a + Clone> = T::Shared<A>;
fn share<A: 'a + Clone>(fa: Self::Fa<A>) -> Self::SharedA<A> { fn share<A: 'a + Clone>(fa: Self::Fa<A>) -> Self::Shared<A> {
T::share(fa) T::share(fa)
} }
fn unshare<A: 'a + Clone>(sa: Self::SharedA<A>) -> Self::Fa<A> { fn unshare<A: 'a + Clone>(sa: Self::Shared<A>) -> Self::Fa<A> {
T::unshare(sa) T::unshare(sa)
} }
} }

View File

@ -9,7 +9,7 @@
use crate::func::*; use crate::func::*;
#[derive(SharedFunctor)] #[derive(SharedFunctorAny)]
pub struct ResultInstance<E>(E); pub struct ResultInstance<E>(E);
impl<E> WeakFunctor for ResultInstance<E> { impl<E> WeakFunctor for ResultInstance<E> {

View File

@ -4,7 +4,7 @@
use crate::func::*; use crate::func::*;
#[derive(SharedFunctor)] #[derive(SharedFunctorAny)]
pub struct SoloInstance; pub struct SoloInstance;
impl WeakFunctor for SoloInstance { impl WeakFunctor for SoloInstance {

View File

@ -104,14 +104,14 @@ impl<'a, E: 'a> Monad<'a> for TryFutureInstance<E> {
} }
} }
impl<'a, E: 'a + Clone> SharedFunctorA<'a> for TryFutureInstance<E> { impl<'a, E: 'a + Clone> SharedFunctor<'a> for TryFutureInstance<E> {
type SharedA<A: 'a + Clone> = Shared<Pin<Box<dyn 'a + Future<Output = Result<A, E>>>>>; type Shared<A: 'a + Clone> = Shared<Pin<Box<dyn 'a + Future<Output = Result<A, E>>>>>;
fn share<A: 'a + Clone>(fa: Self::Fa<A>) -> Self::SharedA<A> { fn share<A: 'a + Clone>(fa: Self::Fa<A>) -> Self::Shared<A> {
fa.shared() fa.shared()
} }
fn unshare<A: 'a + Clone>(sa: Self::SharedA<A>) -> Self::Fa<A> { fn unshare<A: 'a + Clone>(sa: Self::Shared<A>) -> Self::Fa<A> {
Box::pin(sa) Box::pin(sa)
} }
} }