From deb96a3692f20d783f7d25bf5ed402156035cb9c Mon Sep 17 00:00:00 2001 From: timofey Date: Fri, 10 May 2024 18:02:41 +0300 Subject: [PATCH] purrrr --- src/model_01.rs | 65 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 50 insertions(+), 15 deletions(-) diff --git a/src/model_01.rs b/src/model_01.rs index 35e9fb7..acc13e9 100644 --- a/src/model_01.rs +++ b/src/model_01.rs @@ -1,9 +1,9 @@ use std::{ - future::Future, pin::Pin, task::{Context, Poll}, }; +use futures::{future::ready, Future, FutureExt}; use pin_project::pin_project; trait More { @@ -379,26 +379,31 @@ trait TraitInto { } impl>> TraitInto for I { + #[inline] fn trait_into(self) -> A { I::method_s(self) } } +#[repr(transparent)] #[pin_project] struct TraitFuture>(#[pin] F); impl> Future for TraitFuture { type Output = F::Associated; + #[inline] fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { F::method((self.project().0, cx)) } } +#[inline] fn aaaaaaa(a: impl Impl>) -> A { a.trait_into() } +#[inline] fn aaaaaa< A, Ot: ?Sized + OverlayTrait>, @@ -411,7 +416,8 @@ fn aaaaaa< aaaaaaa::(a) } -async fn aaaaa< +#[inline] +fn aaaaa< A, Ot: ?Sized + OverlayTrait>, Om: ?Sized + OverlayMore, @@ -419,12 +425,11 @@ async fn aaaaa< I: ImplOverlay + Impl + ImplMember, >( a: I, -) -> A { - let a = TraitFuture(a).await; - let a: >::_Associated = a; - aaaaaa::(a) +) -> impl Future { + TraitFuture(a).map(aaaaaa::) } +#[inline] fn aaaa< A, Ot: ?Sized + OverlayTrait>, @@ -437,6 +442,7 @@ fn aaaa< aaaaa(upcast_ioi_ioia(upcast_im_ioi::(a))) } +#[inline] fn aaa(a: impl Impl>) -> impl Future { aaaa(upcast_i_im(a)) } @@ -446,6 +452,7 @@ trait TraitIntoFuture { } impl>> TraitIntoFuture for F { + #[inline] fn trait_into_future(self) -> impl Future { aaa(self) } @@ -462,23 +469,26 @@ impl Functor for Futures { type Trait = FutureIs; fn pure(a: A) -> impl Impl> { - async { a } + ready(a) } + #[inline] fn map( a: impl Impl>, f: impl FnOnce(A) -> B, ) -> impl Impl> { - async { f(a.trait_into_future().await) } + a.trait_into_future().map(f) } } +#[inline] fn upcast_ioi_ioia + Impl>( value: I, ) -> impl ImplOverlay + ImplMember<::Member> { value } +#[inline] fn upcast_imb_ioi>( value: I::MoreTrait, ) -> impl ImplOverlay + Impl @@ -488,10 +498,12 @@ where value } +#[inline] fn upcast_im_ioi>(value: I) -> impl ImplOverlay { upcast_imb_ioi::(value) } +#[inline] fn upcast_ib_im>(value: I::More) -> impl ImplMore where >::More: Sized, @@ -499,18 +511,41 @@ where value } +#[inline] fn upcast_i_im>(value: I) -> impl ImplMore { upcast_ib_im::(value) } +trait Pure: Sized { + fn pure_(self) -> impl Impl> { + F::pure(self) + } +} + +impl Pure for T {} + +trait Map: Sized { + fn map_(self, f: impl FnOnce(A) -> B) -> impl Impl> + where + Self: Impl>, + { + F::map(self, f) + } +} + +impl Map for T {} + +fn add5_generic(x: i32) -> impl Impl> { + x.pure_::() + .map_::(|x| x + 1) + .map_::(|x| x + 1) + .map_::(|x| x + 1) + .map_::(|x| x + 1) + .map_::(|x| x + 1) +} + pub async fn add5(x: i32) -> i32 { - let x = Futures::pure(x); - let x = Futures::map(x, |x| x + 1); - let x = Futures::map(x, |x| x + 1); - let x = Futures::map(x, |x| x + 1); - let x = Futures::map(x, |x| x + 1); - let x = Futures::map(x, |x| x + 1); - x.trait_into_future().await + add5_generic::(x).trait_into_future().await } #[test]