SharedFunctorAny
				
					
				
			This commit is contained in:
		
							parent
							
								
									bff238ff00
								
							
						
					
					
						commit
						1012f9be5e
					
				| @ -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, | ||||
|             { | ||||
|  | ||||
							
								
								
									
										30
									
								
								src/func.rs
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								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: 'a + Clone>: 'a + Clone; | ||||
| pub trait SharedFunctor<'a>: WeakFunctorA<'a> { | ||||
|     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) | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -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> | ||||
| { | ||||
|     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)) | ||||
|     } | ||||
| 
 | ||||
|     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)) | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -23,7 +23,7 @@ impl<A, E: Effect> WithEffect<A, E> { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| #[derive(SharedFunctor)] | ||||
| #[derive(SharedFunctorAny)] | ||||
| pub struct EffectInstance<E>(E); | ||||
| 
 | ||||
| impl<E> WeakFunctor for EffectInstance<E> { | ||||
|  | ||||
| @ -107,14 +107,14 @@ impl<'a> Monad<'a> for FutureInstance { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl<'a> SharedFunctorA<'a> for FutureInstance { | ||||
|     type SharedA<A: 'a + Clone> = Shared<Pin<Box<dyn 'a + Future<Output = A>>>>; | ||||
| impl<'a> SharedFunctor<'a> for FutureInstance { | ||||
|     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() | ||||
|     } | ||||
| 
 | ||||
|     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) | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -103,14 +103,14 @@ fn unshare<'a, A: 'a + Clone>(shared: &mut Option<Box<dyn 'a + FnOnce() -> A>>) | ||||
|     a | ||||
| } | ||||
| 
 | ||||
| impl<'a> SharedFunctorA<'a> for LazyInstance { | ||||
|     type SharedA<A: 'a + Clone> = Rc<RefCell<Option<Box<dyn 'a + FnOnce() -> A>>>>; | ||||
| impl<'a> SharedFunctor<'a> for LazyInstance { | ||||
|     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))) | ||||
|     } | ||||
| 
 | ||||
|     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())) | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -9,7 +9,7 @@ | ||||
| 
 | ||||
| use crate::func::*; | ||||
| 
 | ||||
| #[derive(SharedFunctor)] | ||||
| #[derive(SharedFunctorAny)] | ||||
| pub struct OptionInstance; | ||||
| 
 | ||||
| impl WeakFunctor for OptionInstance { | ||||
|  | ||||
| @ -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> | ||||
| { | ||||
|     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) | ||||
|     } | ||||
| 
 | ||||
|     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) | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -9,7 +9,7 @@ | ||||
| 
 | ||||
| use crate::func::*; | ||||
| 
 | ||||
| #[derive(SharedFunctor)] | ||||
| #[derive(SharedFunctorAny)] | ||||
| pub struct ResultInstance<E>(E); | ||||
| 
 | ||||
| impl<E> WeakFunctor for ResultInstance<E> { | ||||
|  | ||||
| @ -4,7 +4,7 @@ | ||||
| 
 | ||||
| use crate::func::*; | ||||
| 
 | ||||
| #[derive(SharedFunctor)] | ||||
| #[derive(SharedFunctorAny)] | ||||
| pub struct SoloInstance; | ||||
| 
 | ||||
| impl WeakFunctor for SoloInstance { | ||||
|  | ||||
| @ -104,14 +104,14 @@ impl<'a, E: 'a> Monad<'a> for TryFutureInstance<E> { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl<'a, E: 'a + Clone> SharedFunctorA<'a> for TryFutureInstance<E> { | ||||
|     type SharedA<A: 'a + Clone> = Shared<Pin<Box<dyn 'a + Future<Output = Result<A, E>>>>>; | ||||
| impl<'a, E: 'a + Clone> SharedFunctor<'a> for TryFutureInstance<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() | ||||
|     } | ||||
| 
 | ||||
|     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) | ||||
|     } | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user