Diffstat (limited to 'src/transform.rs')
| -rw-r--r-- | src/transform.rs | 56 |
1 files changed, 28 insertions, 28 deletions
diff --git a/src/transform.rs b/src/transform.rs index fc37e01..8721845 100644 --- a/src/transform.rs +++ b/src/transform.rs @@ -1,21 +1,19 @@ +use effectful::{r#async::Async, block_on::Spin, blocking::Blocking, bound::{Ds, No, Ss, Yes, D}, effective::Effective, environment::{Cfg, Environment, NativeForm}}; use futures::Future; use crate::{ build::Builder, - effect::{ - blocking::Blocking, r#async::Async, Effect, Effective, EffectiveExt, ErasedEffective, - }, Build, BuilderTypes, DefaultMode, Walk, Walker, }; #[inline(always)] #[allow(clippy::type_complexity)] -pub fn transform<'a, 'ctx: 'a, B: Builder<'ctx, E> + 'a, W: Walker<'ctx, E> + 'a, E: Effect>( +pub fn transform<'a, 'ctx: 'a, B: Builder<'ctx, E> + 'a, W: Walker<'ctx, E> + 'a, E: Environment>( seed: B::Seed, walker: W, -) -> ErasedEffective<'a, (Result<B::Value, B::Error>, Result<W::Output, W::Error>), E> { +) -> NativeForm<'a, (Result<B::Value, B::Error>, Result<W::Output, W::Error>), E> { B::from_seed(seed) - .as_ctx(|builder| walker.walk(builder.as_visitor()).cast()) + .update(|builder| walker.walk(builder.as_visitor()).cast()) .then(|(builder, walker_result)| { builder .build() @@ -61,14 +59,14 @@ pub trait BuildExt { walker: W, ) -> Result< Self, - BuildError<<Self::Builder as BuilderTypes>::Error, <W as Walker<'ctx, Blocking>>::Error>, + BuildError<<Self::Builder as BuilderTypes<Blocking<Cfg<Spin, No, No>>>>::Error, <W as Walker<'ctx, Blocking<Cfg<Spin, No, No>>>>::Error>, > where - Self: Build<'ctx, DefaultMode, Blocking>, - <Self::Builder as BuilderTypes>::Seed: Default, - W: Walker<'ctx, Blocking>, + 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>>>, { - match transform::<Self::Builder, _, _>(Default::default(), walker).value() { + match transform::<Self::Builder, _, _>(Default::default(), walker).into_value() { (Ok(value), _) => Ok(value), (Err(err), Ok(_)) => Err(BuildError::Builder(err)), (Err(build_err), Err(walker_err)) => Err(BuildError::Both(build_err, walker_err)), @@ -80,17 +78,19 @@ pub trait BuildExt { ) -> impl Future< Output = Result< Self, - BuildError<<Self::Builder as BuilderTypes>::Error, <W as Walker<'ctx, Async>>::Error>, + BuildError<<Self::Builder as BuilderTypes<Async<Cfg<Spin, Yes, Yes>>>>::Error, <W as Walker<'ctx, Async<Cfg<Spin, Yes, Yes>>>>::Error>, >, > + Send + Sync where - Self: Build<'ctx, DefaultMode, Async>, - <Self::Builder as BuilderTypes>::Seed: Default, - W: Walker<'ctx, Async>, + 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>>>, { + let walker = Ds(walker); async { - match transform::<Self::Builder, _, _>(Default::default(), walker) + let walker = walker; + match transform::<Self::Builder, _, _>(Default::default(), walker.0) .into_future() .await { @@ -103,28 +103,28 @@ pub trait BuildExt { fn new_builder<'ctx>() -> Self::Builder where - Self: Build<'ctx, DefaultMode, Blocking>, - <Self::Builder as BuilderTypes>::Seed: Default, + Self: Build<'ctx, DefaultMode, Blocking<Cfg<Spin, No, No>>>, + <Self::Builder as BuilderTypes<Blocking<Cfg<Spin, No, No>>>>::Seed: Default, { - Self::Builder::from_seed(Default::default()).value() + Self::Builder::from_seed(Default::default()).into_value() } } impl<T> BuildExt for T {} pub trait WalkExt { - fn as_walker<'ctx: 'a, 'a>(&'a self) -> <&'a Self as Walk<'ctx, DefaultMode, Blocking>>::Walker + fn as_walker<'ctx: 'a, 'a>(&'a self) -> <&'a Self as Walk<'ctx, DefaultMode, Blocking<Cfg<Spin, No, No>>>>::Walker where - &'a Self: Walk<'ctx, DefaultMode, Blocking>, + &'a Self: Walk<'ctx, DefaultMode, Blocking<Cfg<Spin, No, No>>>, { - Walk::into_walker(self).value() + Walk::into_walker(self).into_value() } fn as_async_walker<'ctx: 'a, 'a>( &'a self, - ) -> impl Future<Output = <&'a Self as Walk<'ctx, DefaultMode, Async>>::Walker> + Send + Sync + ) -> impl Future<Output = <&'a Self as Walk<'ctx, DefaultMode, Async<Cfg<Spin, Yes, Yes>>>>::Walker> where - &'a Self: Walk<'ctx, DefaultMode, Async>, + &'a Self: Walk<'ctx, DefaultMode, Async<Cfg<Spin, Yes, Yes>>>, { Walk::into_walker(self).into_future() } @@ -132,12 +132,12 @@ pub trait WalkExt { #[allow(clippy::result_unit_err)] fn walk<'ctx: 'a, 'a, B>(&'a self, builder: B) -> Result<B::Value, ()> where - &'a Self: Walk<'ctx, DefaultMode, Blocking>, - B: Builder<'ctx, Blocking>, + &'a Self: Walk<'ctx, DefaultMode, Blocking<Cfg<Spin, No, No>>>, + B: Builder<'ctx, Blocking<Cfg<Spin, No, No>>>, { let mut builder = builder; - let _ = Walk::into_walker(self).value().walk(builder.as_visitor()); - match builder.build().value() { + let _ = Walk::into_walker(self).into_value().walk(builder.as_visitor()); + match builder.build().into_value() { Ok(value) => Ok(value), _ => todo!(), } |