Diffstat (limited to 'src/transform.rs')
-rw-r--r--src/transform.rs23
1 files changed, 19 insertions, 4 deletions
diff --git a/src/transform.rs b/src/transform.rs
index 91129c7..9f92ba2 100644
--- a/src/transform.rs
+++ b/src/transform.rs
@@ -1,17 +1,32 @@
+use core::marker::PhantomData;
+
use crate::{
build::Builder,
- effect::{Effect, ObjSafe},
+ effect::{Adapters, Effect, ObjSafe},
hkt::Marker,
Walk, Walker, WalkerTypes,
};
-#[inline]
+#[inline(always)]
#[allow(clippy::type_complexity)]
-pub fn transform<'a, 'ctx, 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: Effect>(
seed: B::Seed,
walker: W,
) -> ObjSafe<'a, (Result<B::Value, B::Error>, Result<W::Output, W::Error>), E> {
- todo!()
+ B::from_seed(seed)
+ .as_ctx_for(
+ #[inline(always)]
+ move |builder, _| (walker.walk(builder.as_visitor()), PhantomData),
+ )
+ .then(|(builder, walker_result), _| {
+ builder
+ .build()
+ .map(|builder_result| (builder_result, walker_result))
+ .into()
+ })
+ .into()
+ // B::from_seed(seed).map_with(walker, |builder, walker| walker.walk(builder.as_visitor()));
+
// E::wrap(async {
// // Create builder from seed value;
// let mut builder = B::from_seed(seed).await;