Diffstat (limited to 'src/transform.rs')
| -rw-r--r-- | src/transform.rs | 52 |
1 files changed, 39 insertions, 13 deletions
diff --git a/src/transform.rs b/src/transform.rs index 8721845..6930ba1 100644 --- a/src/transform.rs +++ b/src/transform.rs @@ -1,24 +1,40 @@ -use effectful::{r#async::Async, block_on::Spin, blocking::Blocking, bound::{Ds, No, Ss, Yes, D}, effective::Effective, environment::{Cfg, Environment, NativeForm}}; +use effectful::{ + block_on::Spin, + blocking::Blocking, + bound::{Ds, No, Ss, Yes, D}, + effective::Effective, + environment::{Cfg, Environment, NativeForm}, + higher_ranked::Mut, + r#async::Async, +}; use futures::Future; -use crate::{ - build::Builder, - Build, BuilderTypes, DefaultMode, Walk, Walker, -}; +use crate::{build::Builder, 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: Environment>( +pub fn transform< + 'a, + 'ctx: 'a, + B: Builder<'ctx, E> + 'a, + W: Walker<'ctx, E> + 'a, + E: Environment, +>( seed: B::Seed, walker: W, ) -> NativeForm<'a, (Result<B::Value, B::Error>, Result<W::Output, W::Error>), E> { B::from_seed(seed) - .update(|builder| walker.walk(builder.as_visitor()).cast()) - .then(|(builder, walker_result)| { + .update(walker, |walker, builder| { + walker.walk(builder.as_visitor()).cast() + }) + .then((), |_, (builder, walker_result)| { builder .build() - .map(|builder_result| (builder_result, walker_result)) + .map(walker_result, |walker_result, builder_result| { + (builder_result, walker_result) + }) }) + .cast() // B::from_seed(seed).map_with(walker, |builder, walker| walker.walk(builder.as_visitor())); // E::wrap(async { @@ -59,7 +75,10 @@ pub trait BuildExt { 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>, + 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<Cfg<Spin, No, No>>>, @@ -78,7 +97,10 @@ pub trait BuildExt { ) -> 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>, + BuildError< + <Self::Builder as BuilderTypes<Async<Cfg<Spin, Yes, Yes>>>>::Error, + <W as Walker<'ctx, Async<Cfg<Spin, Yes, Yes>>>>::Error, + >, >, > + Send + Sync @@ -113,7 +135,9 @@ pub trait BuildExt { 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 + 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<Cfg<Spin, No, No>>>, { @@ -136,7 +160,9 @@ pub trait WalkExt { B: Builder<'ctx, Blocking<Cfg<Spin, No, No>>>, { let mut builder = builder; - let _ = Walk::into_walker(self).into_value().walk(builder.as_visitor()); + let _ = Walk::into_walker(self) + .into_value() + .walk(builder.as_visitor()); match builder.build().into_value() { Ok(value) => Ok(value), _ => todo!(), |