Diffstat (limited to 'src/transform.rs')
-rw-r--r--src/transform.rs44
1 files changed, 23 insertions, 21 deletions
diff --git a/src/transform.rs b/src/transform.rs
index 5fbcb79..2e3d14b 100644
--- a/src/transform.rs
+++ b/src/transform.rs
@@ -1,28 +1,30 @@
use crate::{
- build::{Build, Builder},
- walk::Walk,
+ build::Builder,
+ effect::{Effect, Future},
Walker,
};
-#[derive(thiserror::Error, Debug)]
-pub enum Either<A, B> {
- #[error(transparent)]
- A(A),
+#[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;
- #[error(transparent)]
- B(B),
-}
+ // 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;
-pub fn from<'ctx, U, T>(
- value: T,
-) -> Result<U, Either<<T::Walker as Walker<'ctx>>::Error, <U::Builder as Builder<'ctx>>::Error>>
-where
- T: Walk<'ctx>,
- U: Build<'ctx>,
-{
- let mut builder = U::Builder::default();
- T::Walker::from(value)
- .walk(builder.as_visitor())
- .map_err(Either::A)?;
- builder.build().map_err(Either::B)
+ (builder_result, walker_result)
+ })
}