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