Diffstat (limited to 'src/macros/build.rs')
-rw-r--r--src/macros/build.rs24
1 files changed, 22 insertions, 2 deletions
diff --git a/src/macros/build.rs b/src/macros/build.rs
index 2734d2d..2a45c0a 100644
--- a/src/macros/build.rs
+++ b/src/macros/build.rs
@@ -44,10 +44,19 @@ macro_rules! Build {
type Error = Error;
type Seed = ($(<$type as $crate::BuilderTypes>::Seed),*);
+ #[inline(always)]
fn new_builders<'a>(seed: Self::Seed) -> $crate::effect::ObjSafe<'a, Self::Builders, E> {
let ($($field),*) = seed;
- todo!();
+ use $crate::effect::Adapters;
+
+ E::join(
+ $crate::effect::Join(($(<<$type as $crate::Build<'ctx, M, E>>::Builder as $crate::Builder::<E>>::from_seed($field),)*), $crate::hkt::Marker::default())
+ ).map(|($($field,)*)| {
+ Builders {
+ $($field),*
+ }
+ }).into()
// E::wrap(async move {
// Builders {
@@ -58,8 +67,19 @@ macro_rules! Build {
fn from_builders<'a>(builders: Self::Builders) -> $crate::effect::ObjSafe<'a, Result<Self::T, Self::Error>, E> {
use $crate::Builder;
+ use $crate::effect::Adapters;
+
+ E::try_join(
+ $crate::effect::Join((
+ $(builders.$field.build().map(|x| x.map_err(Error::$field)).into(),)*
+ ), $crate::hkt::Marker::default())
+ ).map(|result| match result {
+ Ok(($($field,)*)) => Ok($name {
+ $($field),*
+ }),
+ Err(err) => Err(err)
+ }).into()
- todo!();
// E::wrap(async {
// Ok($name {
// $($field: builders.$field.build().await.map_err(Error::$field)?),*