Diffstat (limited to 'src/macros/build.rs')
-rw-r--r--src/macros/build.rs45
1 files changed, 24 insertions, 21 deletions
diff --git a/src/macros/build.rs b/src/macros/build.rs
index 4272bed..a0ad6ab 100644
--- a/src/macros/build.rs
+++ b/src/macros/build.rs
@@ -100,32 +100,35 @@ macro_rules! Build {
fn new_builders<'a>(seed: Self::Seed) -> effectful::environment::NativeForm<'a, Self::Builders, E> {
let ($($field),*) = seed;
- todo!()
-
- // $crate::effect::join(
- // ($(<<$type as $crate::Build<'ctx, M, E>>::Builder as $crate::Builder::<E>>::from_seed($field),)*)
- // ).map(|($($field,)*)| {
- // Builders {
- // $($field),*
- // }
- // })
+ use effectful::effective::Effective;
+
+ effectful::effective::join(
+ ($(<<$type as $crate::Build<'ctx, M, E>>::Builder as $crate::Builder::<E>>::from_seed($field),)*)
+ ).map((), |_, ($($field,)*)| {
+ Builders {
+ $($field),*
+ }
+ })
+ .cast()
}
fn from_builders<'a>(builders: Self::Builders) -> effectful::environment::NativeForm<'a, Result<effectful::bound::Dynamic<Self::T>, Self::Error>, E> {
use $crate::Builder;
- todo!()
-
- // $crate::effect::try_join(
- // (
- // $(|| builders.$field.build().map(|x| x.map_err(Error::$field)),)*
- // )
- // ).map(|result| match result {
- // Ok(($($field,)*)) => Ok($name {
- // $($field),*
- // }),
- // Err(err) => Err(err)
- // })
+ use effectful::effective::Effective;
+ use $crate::BuilderTypes;
+
+ effectful::effective::try_join(
+ (
+ $(builders.$field.build().map((), |_, x| x.map(|x| <<$type as Build<'ctx, M, E>>::Builder as BuilderTypes<E>>::unwrap_output(x)).map_err(Error::$field)),)*
+ )
+ ).map((), |_, result| match result {
+ Ok(($($field,)*)) => Ok(effectful::bound::Dynamic($name {
+ $($field),*
+ })),
+ Err(err) => Err(err)
+ })
+ .cast()
}
fn as_visitor<'a>(