Diffstat (limited to 'src/macros/build.rs')
| -rw-r--r-- | src/macros/build.rs | 44 |
1 files changed, 24 insertions, 20 deletions
diff --git a/src/macros/build.rs b/src/macros/build.rs index 49dc396..132a4f4 100644 --- a/src/macros/build.rs +++ b/src/macros/build.rs @@ -11,9 +11,9 @@ macro_rules! Build { // add a module here to seal fields. impl<'ctx, M: 'ctx, E: effectful::environment::Environment> $crate::Build<'ctx, M, E> for $name where - effectful::bound::Dynamic<$name>: effectful::environment::DynBind<E>, + effectful::bound::Dynamic<$name>: effectful::bound::DynBind<E>, $($type: $crate::Build<'ctx, M, E>,)* - $(effectful::bound::Dynamic<$type>: effectful::environment::DynBind<E>,)* + $(effectful::bound::Dynamic<$type>: effectful::bound::DynBind<E>,)* $crate::build::builders::core::r#struct::StructBuilder<'ctx, __Info, M, E>: $crate::Builder<'ctx, E, Value = Self> { type Builder = $crate::build::builders::core::r#struct::StructBuilder<'ctx, __Info, M, E>; @@ -83,9 +83,9 @@ macro_rules! Build { impl<'ctx, M: 'ctx, E: effectful::environment::Environment> $crate::build::builders::core::r#struct::StructTypeInfo<'ctx, M, E> for __Info where - effectful::bound::Dynamic<$name>: effectful::environment::DynBind<E>, + effectful::bound::Dynamic<$name>: effectful::bound::DynBind<E>, $($type: $crate::Build<'ctx, M, E>,)* - $(effectful::bound::Dynamic<$type>: effectful::environment::DynBind<E>),* + $(effectful::bound::Dynamic<$type>: effectful::bound::DynBind<E>),* { type Builders = Builders<'ctx, M, E>; type FieldMarker = Field; @@ -99,13 +99,14 @@ macro_rules! Build { }; #[inline(always)] - fn new_builders<'a>(seed: Self::Seed) -> effectful::environment::NativeForm<'a, Self::Builders, E> { + fn new_builders<'a>(seed: Self::Seed) -> effectful::effective::Canonical<'a, Self::Builders, E> { let ($($field),*) = seed; use effectful::effective::Effective; + use effectful::join; - effectful::effective::join( - ($(<<$type as $crate::Build<'ctx, M, E>>::Builder as $crate::Builder::<E>>::from_seed($field),)*) + ::effectful::join!( + $(#[capture($field)] || <<$type as $crate::Build<'ctx, M, E>>::Builder as $crate::Builder::<E>>::from_seed($field),)* ).map((), |_, ($($field,)*)| { Builders { $($field),* @@ -114,16 +115,19 @@ macro_rules! Build { .cast() } - fn from_builders<'a>(builders: Self::Builders) -> effectful::environment::NativeForm<'a, Result<effectful::bound::Dynamic<Self::T>, Self::Error>, E> { + fn from_builders<'a>(builders: Self::Builders) -> effectful::effective::Canonical<'a, Result<effectful::bound::Dynamic<Self::T>, Self::Error>, E> { use $crate::Builder; use effectful::effective::Effective; use $crate::build::BuilderTypes; + use effectful::try_join; - effectful::effective::try_join( - ( - $(builders.$field.build().map((), |_, x| x.map(|x| effectful::bound::Dynamic(<<$type as Build<'ctx, M, E>>::Builder as BuilderTypes<E>>::unwrap_output(x))).map_err(Error::$field)),)* - ) + let Builders { + $($field),* + } = builders; + + ::effectful::try_join!( + $(#[capture($field)] || $field.build().map((), |_, x| x.map(|x| effectful::bound::Dynamic(<<$type as Build<'ctx, M, E>>::Builder as BuilderTypes<E>>::unwrap_output(x))).map_err(Error::$field)),)* ).map((), |_, result| match result { Ok(($(effectful::bound::Dynamic($field),)*)) => Ok(effectful::bound::Dynamic($name { $($field),* @@ -175,7 +179,7 @@ macro_rules! Build { // add a module here to seal fields. impl<'ctx, M: 'ctx, E: effectful::environment::Environment> $crate::Build<'ctx, M, E> for $name where - effectful::bound::Dynamic<$name>: effectful::environment::DynBind<E>, + effectful::bound::Dynamic<$name>: effectful::bound::DynBind<E>, $($value: $crate::Build<'ctx, M, E>,)* $(<<$value as Build<'ctx, M, E>>::Builder as BuilderTypes<E>>::Seed: Default,)* $crate::build::builders::core::r#enum::EnumBuilder<'ctx, __Info, M, E>: $crate::Builder<'ctx, E, Value = Self> @@ -272,7 +276,7 @@ macro_rules! Build { impl<'ctx, M: 'ctx, E: effectful::environment::Environment> $crate::build::builders::core::r#enum::EnumBuildInfo<'ctx, M, E> for __Info where - effectful::bound::Dynamic<$name>: effectful::environment::DynBind<E>, + effectful::bound::Dynamic<$name>: effectful::bound::DynBind<E>, $($value: $crate::Build<'ctx, M, E>,)* $(<<$value as Build<'ctx, M, E>>::Builder as BuilderTypes<E>>::Seed: Default),* { @@ -291,7 +295,7 @@ macro_rules! Build { fn new_builder<'a>( seed: Self::Seed, variant: Self::VariantMarker, - ) -> NativeForm<'a, Self::Builders, E> { + ) -> Canonical<'a, Self::Builders, E> { match variant { $(__Marker::$variant => { Builder::<E>::from_seed(Default::default()).map((), |_, builder| __Builders::$variant(builder)).cast() @@ -301,13 +305,13 @@ macro_rules! Build { fn finish_builder<'a>( builder: Self::Builders, - ) -> NativeForm<'a, Result<effectful::bound::Dynamic<Self::T>, Self::Error>, E> { + ) -> Canonical<'a, Result<effectful::bound::Dynamic<Self::T>, Self::Error>, E> { match builder { $(__Builders::$variant(builder) => builder.build().map((), |_, value| value.map(|x| effectful::bound::Dynamic($name::$variant(<<$value as Build<'ctx, M, E>>::Builder as BuilderTypes<E>>::unwrap_output(x)))).map_err(__Error::$variant)).cast()),* } } - fn from_value<'a>(value: TypeName::T<'a, 'ctx, Self::ValueT, E>) -> Self::T { + fn from_value<'a>(value: $crate::any::type_name::Lowered<'a, 'ctx, Self::ValueT, E>) -> Self::T { value.0 } @@ -334,8 +338,8 @@ macro_rules! Build { fn guess_variant<'a>( seed: Self::Seed, scope: DynRecoverableScope<'a, 'ctx, E>, - ) -> NativeForm<'a, Result<effectful::bound::Dynamic<Self::T>, Self::Error>, E> { - use effectful::effective::EffectiveExt; + ) -> Canonical<'a, Result<effectful::bound::Dynamic<Self::T>, Self::Error>, E> { + use effectful::effective::Effective; use effectful::short::ResultErrorExt; E::value((scope, Err(__ErrorBuilder::<M, E> { A: None, B: None }))) @@ -344,7 +348,7 @@ macro_rules! Build { <<$value as Build<M, E>>::Builder as Builder<_>>::from_seed(Default::default()) .map(scope, |scope, builder| (scope, builder)) - .update((), |(), (scope, builder)| scope.new_walk(builder.as_visitor()).cast()) + .update_map((), |(), (scope, builder)| scope.new_walk(builder.as_visitor()).cast()) .then((), |(), ((_, builder), _)| builder.build()) .map(error, |mut error, result| { result.map(|x| effectful::bound::Dynamic(X::$variant( |