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