Diffstat (limited to 'src/transform.rs')
-rw-r--r--src/transform.rs52
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!(),