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