use crate::{
build::Builder,
effect::{Effect, Future},
Walker,
};
#[inline]
pub fn transform<'a, 'ctx, B: Builder<'ctx, E> + 'a, W: Walker<'ctx, 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)
})
}