Diffstat (limited to 'src/macros/build.rs')
-rw-r--r--src/macros/build.rs69
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()
}
}
};