Diffstat (limited to 'src/transform.rs')
-rw-r--r--src/transform.rs79
1 files changed, 44 insertions, 35 deletions
diff --git a/src/transform.rs b/src/transform.rs
index ed38a08..c9aa922 100644
--- a/src/transform.rs
+++ b/src/transform.rs
@@ -1,23 +1,30 @@
use effectful::{
- r#async::{Async, AsyncSpin}, block_on::Spin, blocking::{Blocking, BlockingSpin}, bound::{Dynamic, No, Yes}, effective::{Canonical, Effective, FutureShim}, environment::Environment
+ block_on::Spin,
+ blocking::{Blocking, BlockingSpin},
+ bound::{Dynamic, No, Yes},
+ effective::{Canonical, Effective, FutureShim},
+ environment::Environment,
+ r#async::{Async, AsyncSpin},
};
use futures::Future;
-use crate::{build::Builder, build::BuilderTypes, Build, DefaultMode, Walk, Walker};
+use crate::{
+ build::{builders::core::tracer::Tracer, Builder, BuilderTypes},
+ Build, DefaultMode, Walk, Walker,
+};
#[inline(always)]
#[allow(clippy::type_complexity)]
pub fn transform<
- 'a,
- 'builder: 'a,
- 'ctx: 'builder,
- B: Builder<'builder, 'ctx, E> + 'a,
- W: Walker<'ctx, E> + 'a,
+ 'u,
+ 'src: 'u,
+ B: Builder<'src, E> + 'u,
+ W: Walker<'src, E> + 'u,
E: Environment,
>(
seed: B::Seed,
walker: W,
-) -> Canonical<'a, (Result<B::Output, B::Error>, Result<W::Output, W::Error>), E> {
+) -> Canonical<'u, (Result<B::Output, B::Error>, Result<W::Output, W::Error>), E> {
B::from_seed(seed)
.update_map(walker, |walker, builder| {
walker.walk(builder.as_visitor()).cast()
@@ -67,19 +74,19 @@ where
pub trait BuildExt {
/// Build a value of this type using the default builder.
#[allow(clippy::type_complexity)]
- fn build<'lt, 'ctx: 'lt, W>(
+ fn build<'u, 'src: 'u, W>(
walker: W,
) -> Result<
Self,
BuildError<
<Self::Builder as BuilderTypes<BlockingSpin>>::Error,
- <W as Walker<'ctx, BlockingSpin>>::Error,
+ <W as Walker<'src, BlockingSpin>>::Error,
>,
>
where
- Self: Build<'lt, 'ctx, DefaultMode, BlockingSpin>,
+ Self: Build<'src, DefaultMode, BlockingSpin>,
<Self::Builder as BuilderTypes<BlockingSpin>>::Seed: Default,
- W: Walker<'ctx, BlockingSpin>,
+ W: Walker<'src, BlockingSpin>,
{
match transform::<Self::Builder, _, _>(Default::default(), walker).wait() {
(Ok(value), _) => Ok(Self::Builder::unwrap_output(value)),
@@ -88,27 +95,31 @@ pub trait BuildExt {
}
}
- fn build_async<'lt, 'ctx: 'lt, W>(
+ fn build_async<'u, 'src: 'u, W>(
walker: W,
) -> impl Future<
Output = Result<
Self,
BuildError<
<Self::Builder as BuilderTypes<AsyncSpin>>::Error,
- <W as Walker<'ctx, AsyncSpin>>::Error,
+ <W as Walker<'src, AsyncSpin>>::Error,
>,
>,
> + Send
where
- Self: Build<'lt, 'ctx, DefaultMode, AsyncSpin>,
+ Self: Build<'src, DefaultMode, AsyncSpin>,
<Self::Builder as BuilderTypes<AsyncSpin>>::Seed: Default,
- W: Walker<'ctx, AsyncSpin>,
+ W: Walker<'src, AsyncSpin>,
{
let walker = Dynamic(walker);
async {
let walker = walker;
- match FutureShim::new(transform::<Self::Builder, _, _>(Default::default(), walker.0)).into_inner()
- .await
+ match FutureShim::new(transform::<Self::Builder, _, _>(
+ Default::default(),
+ walker.0,
+ ))
+ .into_inner()
+ .await
{
(Ok(value), _) => Ok(Self::Builder::unwrap_output(value)),
(Err(err), Ok(_)) => Err(BuildError::Builder(err)),
@@ -117,46 +128,44 @@ pub trait BuildExt {
}
}
- fn new_builder<'lt, 'ctx: 'lt>() -> Self::Builder
+ fn new_builder<'u, 'src: 'u>() -> Tracer<Self::Builder, BlockingSpin>
where
- Self: Build<'lt, 'ctx, DefaultMode, BlockingSpin>,
+ Self: Build<'src, DefaultMode, BlockingSpin>,
<Self::Builder as BuilderTypes<BlockingSpin>>::Seed: Default,
{
- Self::Builder::from_seed(Default::default()).wait()
+ Tracer::<Self::Builder, _>::from_seed(Default::default()).wait()
}
}
impl<T> BuildExt for T {}
pub trait WalkExt {
- fn as_walker<'ctx: 'a, 'a>(
- &'a self,
- ) -> <&'a Self as Walk<'ctx, DefaultMode, BlockingSpin>>::Walker
+ fn as_walker<'r, 'src: 'r>(
+ &'r self,
+ ) -> <&'r Self as Walk<'src, DefaultMode, BlockingSpin>>::Walker
where
- &'a Self: Walk<'ctx, DefaultMode, BlockingSpin>,
+ &'r Self: Walk<'src, DefaultMode, BlockingSpin>,
{
Walk::into_walker(self).wait()
}
- fn as_async_walker<'ctx: 'a, 'a>(
- &'a self,
- ) -> impl Future<Output = <&'a Self as Walk<'ctx, DefaultMode, AsyncSpin>>::Walker>
+ fn as_async_walker<'r, 'src: 'r>(
+ &'r self,
+ ) -> impl Future<Output = <&'r Self as Walk<'src, DefaultMode, AsyncSpin>>::Walker>
where
- &'a Self: Walk<'ctx, DefaultMode, AsyncSpin>,
+ &'r Self: Walk<'src, DefaultMode, AsyncSpin>,
{
FutureShim::new(Walk::into_walker(self))
}
#[allow(clippy::result_unit_err)]
- fn walk<'lt, 'ctx: 'lt + 'a, 'a, B>(&'a self, builder: B) -> Result<B::Value, ()>
+ fn walk<'r, 'src, B>(&'r self, builder: B) -> Result<B::Value, ()>
where
- &'a Self: Walk<'ctx, DefaultMode, BlockingSpin>,
- B: Builder<'lt, 'ctx, BlockingSpin>,
+ &'r Self: Walk<'src, DefaultMode, BlockingSpin>,
+ B: Builder<'src, BlockingSpin>,
{
let mut builder = builder;
- let _ = Walk::into_walker(self)
- .wait()
- .walk(builder.as_visitor());
+ let _ = Walk::into_walker(self).wait().walk(builder.as_visitor());
match builder.build().wait() {
Ok(value) => Ok(B::unwrap_output(value)),
_ => todo!(),