Diffstat (limited to 'src/transform.rs')
| -rw-r--r-- | src/transform.rs | 78 |
1 files changed, 36 insertions, 42 deletions
diff --git a/src/transform.rs b/src/transform.rs index 48b0f03..ed38a08 100644 --- a/src/transform.rs +++ b/src/transform.rs @@ -1,10 +1,5 @@ use effectful::{ - block_on::Spin, - blocking::Blocking, - bound::{DynamicShim, No, Yes}, - effective::Effective, - environment::{Cfg, Environment, NativeForm}, - r#async::Async, + r#async::{Async, AsyncSpin}, block_on::Spin, blocking::{Blocking, BlockingSpin}, bound::{Dynamic, No, Yes}, effective::{Canonical, Effective, FutureShim}, environment::Environment }; use futures::Future; @@ -14,16 +9,17 @@ use crate::{build::Builder, build::BuilderTypes, Build, DefaultMode, Walk, Walke #[allow(clippy::type_complexity)] pub fn transform< 'a, - 'ctx: 'a, - B: Builder<'ctx, E> + 'a, + 'builder: 'a, + 'ctx: 'builder, + B: Builder<'builder, 'ctx, E> + 'a, W: Walker<'ctx, E> + 'a, E: Environment, >( seed: B::Seed, walker: W, -) -> NativeForm<'a, (Result<B::Output, B::Error>, Result<W::Output, W::Error>), E> { +) -> Canonical<'a, (Result<B::Output, B::Error>, Result<W::Output, W::Error>), E> { B::from_seed(seed) - .update(walker, |walker, builder| { + .update_map(walker, |walker, builder| { walker.walk(builder.as_visitor()).cast() }) .then((), |_, (builder, walker_result)| { @@ -71,49 +67,47 @@ where pub trait BuildExt { /// Build a value of this type using the default builder. #[allow(clippy::type_complexity)] - fn build<'ctx, W>( + fn build<'lt, 'ctx: 'lt, W>( walker: W, ) -> Result< Self, BuildError< - <Self::Builder as BuilderTypes<Blocking<Cfg<Spin, No, No>>>>::Error, - <W as Walker<'ctx, Blocking<Cfg<Spin, No, No>>>>::Error, + <Self::Builder as BuilderTypes<BlockingSpin>>::Error, + <W as Walker<'ctx, BlockingSpin>>::Error, >, > where - Self: Build<'ctx, DefaultMode, Blocking<Cfg<Spin, No, No>>>, - <Self::Builder as BuilderTypes<Blocking<Cfg<Spin, No, No>>>>::Seed: Default, - W: Walker<'ctx, Blocking<Cfg<Spin, No, No>>>, + Self: Build<'lt, 'ctx, DefaultMode, BlockingSpin>, + <Self::Builder as BuilderTypes<BlockingSpin>>::Seed: Default, + W: Walker<'ctx, BlockingSpin>, { - match transform::<Self::Builder, _, _>(Default::default(), walker).into_value() { + match transform::<Self::Builder, _, _>(Default::default(), walker).wait() { (Ok(value), _) => Ok(Self::Builder::unwrap_output(value)), (Err(err), Ok(_)) => Err(BuildError::Builder(err)), (Err(build_err), Err(walker_err)) => Err(BuildError::Both(build_err, walker_err)), } } - fn build_async<'ctx, W>( + fn build_async<'lt, 'ctx: 'lt, W>( walker: W, ) -> impl Future< Output = Result< Self, BuildError< - <Self::Builder as BuilderTypes<Async<Cfg<Spin, Yes, Yes>>>>::Error, - <W as Walker<'ctx, Async<Cfg<Spin, Yes, Yes>>>>::Error, + <Self::Builder as BuilderTypes<AsyncSpin>>::Error, + <W as Walker<'ctx, AsyncSpin>>::Error, >, >, > + Send - + Sync where - Self: Build<'ctx, DefaultMode, Async<Cfg<Spin, Yes, Yes>>>, - <Self::Builder as BuilderTypes<Async<Cfg<Spin, Yes, Yes>>>>::Seed: Default, - W: Walker<'ctx, Async<Cfg<Spin, Yes, Yes>>>, + Self: Build<'lt, 'ctx, DefaultMode, AsyncSpin>, + <Self::Builder as BuilderTypes<AsyncSpin>>::Seed: Default, + W: Walker<'ctx, AsyncSpin>, { - let walker = DynamicShim(walker); + let walker = Dynamic(walker); async { let walker = walker; - match transform::<Self::Builder, _, _>(Default::default(), walker.0) - .into_future() + match FutureShim::new(transform::<Self::Builder, _, _>(Default::default(), walker.0)).into_inner() .await { (Ok(value), _) => Ok(Self::Builder::unwrap_output(value)), @@ -123,12 +117,12 @@ pub trait BuildExt { } } - fn new_builder<'ctx>() -> Self::Builder + fn new_builder<'lt, 'ctx: 'lt>() -> Self::Builder where - Self: Build<'ctx, DefaultMode, Blocking<Cfg<Spin, No, No>>>, - <Self::Builder as BuilderTypes<Blocking<Cfg<Spin, No, No>>>>::Seed: Default, + Self: Build<'lt, 'ctx, DefaultMode, BlockingSpin>, + <Self::Builder as BuilderTypes<BlockingSpin>>::Seed: Default, { - Self::Builder::from_seed(Default::default()).into_value() + Self::Builder::from_seed(Default::default()).wait() } } @@ -137,33 +131,33 @@ impl<T> BuildExt for T {} pub trait WalkExt { fn as_walker<'ctx: 'a, 'a>( &'a self, - ) -> <&'a Self as Walk<'ctx, DefaultMode, Blocking<Cfg<Spin, No, No>>>>::Walker + ) -> <&'a Self as Walk<'ctx, DefaultMode, BlockingSpin>>::Walker where - &'a Self: Walk<'ctx, DefaultMode, Blocking<Cfg<Spin, No, No>>>, + &'a Self: Walk<'ctx, DefaultMode, BlockingSpin>, { - Walk::into_walker(self).into_value() + Walk::into_walker(self).wait() } fn as_async_walker<'ctx: 'a, 'a>( &'a self, - ) -> impl Future<Output = <&'a Self as Walk<'ctx, DefaultMode, Async<Cfg<Spin, Yes, Yes>>>>::Walker> + ) -> impl Future<Output = <&'a Self as Walk<'ctx, DefaultMode, AsyncSpin>>::Walker> where - &'a Self: Walk<'ctx, DefaultMode, Async<Cfg<Spin, Yes, Yes>>>, + &'a Self: Walk<'ctx, DefaultMode, AsyncSpin>, { - Walk::into_walker(self).into_future() + FutureShim::new(Walk::into_walker(self)) } #[allow(clippy::result_unit_err)] - fn walk<'ctx: 'a, 'a, B>(&'a self, builder: B) -> Result<B::Value, ()> + fn walk<'lt, 'ctx: 'lt + 'a, 'a, B>(&'a self, builder: B) -> Result<B::Value, ()> where - &'a Self: Walk<'ctx, DefaultMode, Blocking<Cfg<Spin, No, No>>>, - B: Builder<'ctx, Blocking<Cfg<Spin, No, No>>>, + &'a Self: Walk<'ctx, DefaultMode, BlockingSpin>, + B: Builder<'lt, 'ctx, BlockingSpin>, { let mut builder = builder; let _ = Walk::into_walker(self) - .into_value() + .wait() .walk(builder.as_visitor()); - match builder.build().into_value() { + match builder.build().wait() { Ok(value) => Ok(B::unwrap_output(value)), _ => todo!(), } |