use crate::{
build::Builder,
effect::{Effect, Future},
Walker,
};
#[inline]
pub fn transform<
'a,
'ctx,
B: Builder<'ctx, Effect = E> + 'a,
W: Walker<'ctx, Effect = E> + 'a,
E: Effect<'ctx>,
>(
seed: B::Seed,
walker: W,
) -> Future<'a, 'ctx, (Result<B::Value, B::Error>, Result<W::Output, W::Error>), E> {
E::wrap(async {
// Create builder from seed value;
let mut builder = B::from_seed(seed).await;
// Walk the walker with the builder as the visitor.
let walker_result = walker.walk(builder.as_visitor()).await;
// Finish building the value.
let builder_result = builder.build().await;
(builder_result, walker_result)
})
}