Diffstat (limited to 'src/transform.rs')
| -rw-r--r-- | src/transform.rs | 79 |
1 files changed, 44 insertions, 35 deletions
diff --git a/src/transform.rs b/src/transform.rs index ed38a08..c9aa922 100644 --- a/src/transform.rs +++ b/src/transform.rs @@ -1,23 +1,30 @@ use effectful::{ - r#async::{Async, AsyncSpin}, block_on::Spin, blocking::{Blocking, BlockingSpin}, bound::{Dynamic, No, Yes}, effective::{Canonical, Effective, FutureShim}, environment::Environment + block_on::Spin, + blocking::{Blocking, BlockingSpin}, + bound::{Dynamic, No, Yes}, + effective::{Canonical, Effective, FutureShim}, + environment::Environment, + r#async::{Async, AsyncSpin}, }; use futures::Future; -use crate::{build::Builder, build::BuilderTypes, Build, DefaultMode, Walk, Walker}; +use crate::{ + build::{builders::core::tracer::Tracer, Builder, BuilderTypes}, + Build, DefaultMode, Walk, Walker, +}; #[inline(always)] #[allow(clippy::type_complexity)] pub fn transform< - 'a, - 'builder: 'a, - 'ctx: 'builder, - B: Builder<'builder, 'ctx, E> + 'a, - W: Walker<'ctx, E> + 'a, + 'u, + 'src: 'u, + B: Builder<'src, E> + 'u, + W: Walker<'src, E> + 'u, E: Environment, >( seed: B::Seed, walker: W, -) -> Canonical<'a, (Result<B::Output, B::Error>, Result<W::Output, W::Error>), E> { +) -> Canonical<'u, (Result<B::Output, B::Error>, Result<W::Output, W::Error>), E> { B::from_seed(seed) .update_map(walker, |walker, builder| { walker.walk(builder.as_visitor()).cast() @@ -67,19 +74,19 @@ where pub trait BuildExt { /// Build a value of this type using the default builder. #[allow(clippy::type_complexity)] - fn build<'lt, 'ctx: 'lt, W>( + fn build<'u, 'src: 'u, W>( walker: W, ) -> Result< Self, BuildError< <Self::Builder as BuilderTypes<BlockingSpin>>::Error, - <W as Walker<'ctx, BlockingSpin>>::Error, + <W as Walker<'src, BlockingSpin>>::Error, >, > where - Self: Build<'lt, 'ctx, DefaultMode, BlockingSpin>, + Self: Build<'src, DefaultMode, BlockingSpin>, <Self::Builder as BuilderTypes<BlockingSpin>>::Seed: Default, - W: Walker<'ctx, BlockingSpin>, + W: Walker<'src, BlockingSpin>, { match transform::<Self::Builder, _, _>(Default::default(), walker).wait() { (Ok(value), _) => Ok(Self::Builder::unwrap_output(value)), @@ -88,27 +95,31 @@ pub trait BuildExt { } } - fn build_async<'lt, 'ctx: 'lt, W>( + fn build_async<'u, 'src: 'u, W>( walker: W, ) -> impl Future< Output = Result< Self, BuildError< <Self::Builder as BuilderTypes<AsyncSpin>>::Error, - <W as Walker<'ctx, AsyncSpin>>::Error, + <W as Walker<'src, AsyncSpin>>::Error, >, >, > + Send where - Self: Build<'lt, 'ctx, DefaultMode, AsyncSpin>, + Self: Build<'src, DefaultMode, AsyncSpin>, <Self::Builder as BuilderTypes<AsyncSpin>>::Seed: Default, - W: Walker<'ctx, AsyncSpin>, + W: Walker<'src, AsyncSpin>, { let walker = Dynamic(walker); async { let walker = walker; - match FutureShim::new(transform::<Self::Builder, _, _>(Default::default(), walker.0)).into_inner() - .await + match FutureShim::new(transform::<Self::Builder, _, _>( + Default::default(), + walker.0, + )) + .into_inner() + .await { (Ok(value), _) => Ok(Self::Builder::unwrap_output(value)), (Err(err), Ok(_)) => Err(BuildError::Builder(err)), @@ -117,46 +128,44 @@ pub trait BuildExt { } } - fn new_builder<'lt, 'ctx: 'lt>() -> Self::Builder + fn new_builder<'u, 'src: 'u>() -> Tracer<Self::Builder, BlockingSpin> where - Self: Build<'lt, 'ctx, DefaultMode, BlockingSpin>, + Self: Build<'src, DefaultMode, BlockingSpin>, <Self::Builder as BuilderTypes<BlockingSpin>>::Seed: Default, { - Self::Builder::from_seed(Default::default()).wait() + Tracer::<Self::Builder, _>::from_seed(Default::default()).wait() } } impl<T> BuildExt for T {} pub trait WalkExt { - fn as_walker<'ctx: 'a, 'a>( - &'a self, - ) -> <&'a Self as Walk<'ctx, DefaultMode, BlockingSpin>>::Walker + fn as_walker<'r, 'src: 'r>( + &'r self, + ) -> <&'r Self as Walk<'src, DefaultMode, BlockingSpin>>::Walker where - &'a Self: Walk<'ctx, DefaultMode, BlockingSpin>, + &'r Self: Walk<'src, DefaultMode, BlockingSpin>, { Walk::into_walker(self).wait() } - fn as_async_walker<'ctx: 'a, 'a>( - &'a self, - ) -> impl Future<Output = <&'a Self as Walk<'ctx, DefaultMode, AsyncSpin>>::Walker> + fn as_async_walker<'r, 'src: 'r>( + &'r self, + ) -> impl Future<Output = <&'r Self as Walk<'src, DefaultMode, AsyncSpin>>::Walker> where - &'a Self: Walk<'ctx, DefaultMode, AsyncSpin>, + &'r Self: Walk<'src, DefaultMode, AsyncSpin>, { FutureShim::new(Walk::into_walker(self)) } #[allow(clippy::result_unit_err)] - fn walk<'lt, 'ctx: 'lt + 'a, 'a, B>(&'a self, builder: B) -> Result<B::Value, ()> + fn walk<'r, 'src, B>(&'r self, builder: B) -> Result<B::Value, ()> where - &'a Self: Walk<'ctx, DefaultMode, BlockingSpin>, - B: Builder<'lt, 'ctx, BlockingSpin>, + &'r Self: Walk<'src, DefaultMode, BlockingSpin>, + B: Builder<'src, BlockingSpin>, { let mut builder = builder; - let _ = Walk::into_walker(self) - .wait() - .walk(builder.as_visitor()); + let _ = Walk::into_walker(self).wait().walk(builder.as_visitor()); match builder.build().wait() { Ok(value) => Ok(B::unwrap_output(value)), _ => todo!(), |