Diffstat (limited to 'src/macros/build.rs')
| -rw-r--r-- | src/macros/build.rs | 69 |
1 files changed, 42 insertions, 27 deletions
diff --git a/src/macros/build.rs b/src/macros/build.rs index 2f7e228..f56ece9 100644 --- a/src/macros/build.rs +++ b/src/macros/build.rs @@ -9,7 +9,7 @@ macro_rules! Build { #[allow(non_upper_case_globals, non_snake_case, non_camel_case_types)] const _: () = { // add a module here to seal fields. - impl<'ctx, M: 'ctx, E: effectful::environment::Environment> $crate::Build<'ctx, M, E> for $name + impl<'ctx, M: 'ctx, E: effectful::environment::Environment> $crate::Build<'ctx, M, E> for $name where $name: effectful::environment::DynBind<E> + effectful::bound::IsSync<E::NeedSend> { @@ -71,7 +71,7 @@ macro_rules! Build { $vis struct __Info; - impl<'ctx, M: 'ctx, E: effectful::environment::Environment> $crate::builders::core::r#struct::StructTypeInfo<'ctx, M, E> for __Info + impl<'ctx, M: 'ctx, E: effectful::environment::Environment> $crate::builders::core::r#struct::StructTypeInfo<'ctx, M, E> for __Info where $name: effectful::environment::DynBind<E> { @@ -158,21 +158,27 @@ macro_rules! Build { #[allow(non_upper_case_globals, non_snake_case, non_camel_case_types)] const _: () = { // add a module here to seal fields. - impl<'ctx, M: 'ctx, E: $crate::effect::Effect> $crate::Build<'ctx, M, E> for $name { + impl<'ctx, M: 'ctx, E: effectful::environment::Environment> $crate::Build<'ctx, M, E> for $name { type Builder = $crate::builders::core::r#enum::EnumBuilder<'ctx, __Info, M, E>; } $vis struct __Info; - $vis enum __Builders<'ctx, M, E: Effect> { + $vis enum __Builders<'ctx, M, E: effectful::environment::Environment> { $($variant(<$value as $crate::Build<'ctx, M, E>>::Builder)),* } + unsafe impl<'ctx, M: 'ctx, E: effectful::environment::Environment> effectful::bound::IsSend<E::NeedSend> for __Builders<'ctx, M, E> {} + unsafe impl<'ctx, M: 'ctx, E: effectful::environment::Environment> effectful::bound::IsSync<E::NeedSync> for __Builders<'ctx, M, E> {} + #[derive(Copy, Clone)] $vis enum __Marker { $($variant),* } + unsafe impl<'ctx, F: effectful::bound::Bool> effectful::bound::IsSend<F> for __Marker {} + unsafe impl<'ctx, F: effectful::bound::Bool> effectful::bound::IsSync<F> for __Marker {} + impl ::core::fmt::Display for __Marker { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { f.write_str(match self { @@ -189,18 +195,24 @@ macro_rules! Build { $(pub const $variant: u32 = __Variants::$variant as u32;)* } - $vis struct __ErrorBuilder<'ctx, M, E: Effect> { - $($variant: Option<<<$value as $crate::Build<'ctx, M, E>>::Builder as BuilderTypes>::Error>),* + $vis struct __ErrorBuilder<'ctx, M, E: Environment> { + $($variant: Option<<<$value as $crate::Build<'ctx, M, E>>::Builder as BuilderTypes<E>>::Error>),* } - $vis enum __Error<'ctx, M, E: Effect> { + unsafe impl<'ctx, M: 'ctx, E: effectful::environment::Environment> effectful::bound::IsSend<E::NeedSend> for __ErrorBuilder<'ctx, M, E> {} + unsafe impl<'ctx, M: 'ctx, E: effectful::environment::Environment> effectful::bound::IsSync<E::NeedSync> for __ErrorBuilder<'ctx, M, E> {} + + $vis enum __Error<'ctx, M, E: Environment> { __Guess { - $($variant: <<$value as $crate::Build<'ctx, M, E>>::Builder as BuilderTypes>::Error),* + $($variant: <<$value as $crate::Build<'ctx, M, E>>::Builder as BuilderTypes<E>>::Error),* }, - $($variant(<<$value as $crate::Build<'ctx, M, E>>::Builder as BuilderTypes>::Error)),* + $($variant(<<$value as $crate::Build<'ctx, M, E>>::Builder as BuilderTypes<E>>::Error)),* } - impl<'ctx, M, E: Effect> ::core::fmt::Display for __Error<'ctx, M, E> { + unsafe impl<'ctx, M: 'ctx, E: effectful::environment::Environment> effectful::bound::IsSend<E::NeedSend> for __Error<'ctx, M, E> {} + unsafe impl<'ctx, M: 'ctx, E: effectful::environment::Environment> effectful::bound::IsSync<E::NeedSync> for __Error<'ctx, M, E> {} + + impl<'ctx, M, E: Environment> ::core::fmt::Display for __Error<'ctx, M, E> { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { match self { Self::__Guess { @@ -215,7 +227,7 @@ macro_rules! Build { } } - impl<'ctx, M, E: Effect> ::core::fmt::Debug for __Error<'ctx, M, E> { + impl<'ctx, M, E: Environment> ::core::fmt::Debug for __Error<'ctx, M, E> { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { match self { Self::__Guess { @@ -230,7 +242,7 @@ macro_rules! Build { } } - impl<'ctx, M: 'ctx, E: $crate::effect::Effect> $crate::builders::core::r#enum::EnumBuildInfo<'ctx, M, E> for __Info { + impl<'ctx, M: 'ctx, E: effectful::environment::Environment> $crate::builders::core::r#enum::EnumBuildInfo<'ctx, M, E> for __Info { type Builders = __Builders<'ctx, M, E>; type Seed = (); @@ -246,27 +258,27 @@ macro_rules! Build { fn new_builder<'a>( seed: Self::Seed, variant: Self::VariantMarker, - ) -> ErasedEffective<'a, Self::Builders, E> { + ) -> NativeForm<'a, Self::Builders, E> { match variant { $(__Marker::$variant => { - Builder::<E>::from_seed(Default::default()).map(|builder| __Builders::$variant(builder)) + Builder::<E>::from_seed(Default::default()).map((), |_, builder| __Builders::$variant(builder)).cast() })* } } fn finish_builder<'a>( builder: Self::Builders, - ) -> ErasedEffective<'a, Result<Self::T, Self::Error>, E> { + ) -> NativeForm<'a, Result<Self::T, Self::Error>, E> { match builder { - $(__Builders::$variant(builder) => builder.build().map(|value| value.map($name::$variant).map_err(__Error::$variant))),* + $(__Builders::$variant(builder) => builder.build().map((), |_, value| value.map($name::$variant).map_err(__Error::$variant)).cast()),* } } - fn from_value<'a>(value: TypeName::T<'a, 'ctx, Self::ValueT>) -> Self::T { + fn from_value<'a>(value: TypeName::T<'a, 'ctx, Self::ValueT, E>) -> Self::T { value.0 } - fn as_visitor<'a>(builder: &'a mut Self::Builders) -> DynVisitor<'a, 'ctx> { + fn as_visitor<'a>(builder: &'a mut Self::Builders) -> DynVisitor<'a, 'ctx, E> { match builder { $(__Builders::$variant(builder) => builder.as_visitor()),* } @@ -289,16 +301,19 @@ macro_rules! Build { fn guess_variant<'a>( seed: Self::Seed, scope: DynRecoverableScope<'a, 'ctx, E>, - ) -> ErasedEffective<'a, Result<Self::T, Self::Error>, E> { - E::ready((scope, Err(__ErrorBuilder::<M, E> { A: None, B: None }))) - $(.or_else_update(|scope, result| { + ) -> NativeForm<'a, Result<Self::T, Self::Error>, E> { + use effectful::effective::EffectiveExt; + use effectful::short::ResultErrorExt; + + E::value((scope, Err(__ErrorBuilder::<M, E> { A: None, B: None }))) + $(.or_else_update((), |_, scope, result| { let mut error = result.into_error(); <<$value as Build<M, E>>::Builder as Builder<_>>::from_seed(Default::default()) - .map(|builder| (scope, builder)) - .as_ctx(|(scope, builder)| scope.new_walk(builder.as_visitor()).cast()) - .then(|((_, builder), _)| builder.build()) - .map(|result| { + .map(scope, |scope, builder| (scope, builder)) + .update((), |(), (scope, builder)| scope.new_walk(builder.as_visitor()).cast()) + .then((), |(), ((_, builder), _)| builder.build()) + .map(error, |mut error, result| { result.map(X::$variant).map_err(|err| { error.$variant = Some(err); error @@ -306,12 +321,12 @@ macro_rules! Build { }) .cast() }))* - .map(|(_, result)| match result { + .map((), |_, (_, result)| match result { Ok(value) => Ok(value), Err(err) => Err(__Error::__Guess { $($variant: err.$variant.unwrap()),* }), - }) + }).cast() } } }; |