Diffstat (limited to 'src/macros/build.rs')
-rw-r--r--src/macros/build.rs116
1 files changed, 74 insertions, 42 deletions
diff --git a/src/macros/build.rs b/src/macros/build.rs
index c77426d..14e4443 100644
--- a/src/macros/build.rs
+++ b/src/macros/build.rs
@@ -9,20 +9,23 @@ 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>
+ effectful::bound::Dynamic<$name>: effectful::environment::DynBind<E>,
+ $($type: $crate::Build<'ctx, M, E>,)*
+ $crate::builders::core::r#struct::StructBuilder<'ctx, __Info, M, E>: $crate::Builder<'ctx, E, Value = Self>
{
type Builder = $crate::builders::core::r#struct::StructBuilder<'ctx, __Info, M, E>;
}
- $vis struct Builders<'ctx, M: 'ctx, E: effectful::environment::Environment> {
+ #[derive(SendSync)]
+ $vis struct Builders<'ctx, M: 'ctx, E: effectful::environment::Environment>
+ where
+ $($type: $crate::Build<'ctx, M, E>),*
+ {
$($field: <$type 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, Debug, SendSync)]
$vis enum Field {
$($field),*
@@ -36,13 +39,14 @@ macro_rules! Build {
$(pub const $field: usize = __Fields::$field as usize;)*
}
- $vis enum Error<'ctx, M: 'ctx, E: effectful::environment::Environment> {
+ #[derive(SendSync)]
+ $vis enum Error<'ctx, M: 'ctx, E: effectful::environment::Environment>
+ where
+ $($type: $crate::Build<'ctx, M, E>),*
+ {
$($field(<<$type as $crate::Build<'ctx, M, E>>::Builder as $crate::BuilderTypes<E>>::Error)),*
}
- 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 ::core::fmt::Display for Field {
fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
f.write_str(match self {
@@ -51,7 +55,10 @@ macro_rules! Build {
}
}
- impl<'ctx, M: 'ctx, E: effectful::environment::Environment> ::core::fmt::Debug for Error<'ctx, M, E> {
+ impl<'ctx, M: 'ctx, E: effectful::environment::Environment> ::core::fmt::Debug for Error<'ctx, M, E>
+ where
+ $($type: $crate::Build<'ctx, M, E>),*
+ {
fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
f.write_str(match self {
$(Error::$field(_) => stringify!($field)),*
@@ -59,7 +66,10 @@ macro_rules! Build {
}
}
- impl<'ctx, M: 'ctx, E: effectful::environment::Environment> ::core::fmt::Display for Error<'ctx, M, E> {
+ impl<'ctx, M: 'ctx, E: effectful::environment::Environment> ::core::fmt::Display for Error<'ctx, M, E>
+ where
+ $($type: $crate::Build<'ctx, M, E>),*
+ {
fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
f.write_str(match self {
$(Error::$field(_) => stringify!($field)),*
@@ -67,18 +77,20 @@ macro_rules! Build {
}
}
+ #[derive(SendSync)]
$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>
+ effectful::bound::Dynamic<$name>: effectful::environment::DynBind<E>,
+ $($type: $crate::Build<'ctx, M, E>),*
{
type Builders = Builders<'ctx, M, E>;
type FieldMarker = Field;
type T = $name;
type Error = Error<'ctx, M, E>;
type Seed = ($(<<$type as $crate::Build<'ctx, M, E>>::Builder as $crate::BuilderTypes<E>>::Seed),*);
- type ValueT = $crate::any::OwnedStatic<$name>;
+ type ValueT = $crate::any::OwnedStatic<effectful::bound::Dynamic<$name>>;
const FIELD_COUNT: usize = {
[$(stringify!($field)),*].len()
@@ -99,7 +111,7 @@ macro_rules! Build {
// })
}
- fn from_builders<'a>(builders: Self::Builders) -> effectful::environment::NativeForm<'a, Result<Self::T, Self::Error>, E> {
+ fn from_builders<'a>(builders: Self::Builders) -> effectful::environment::NativeForm<'a, Result<effectful::bound::Dynamic<Self::T>, Self::Error>, E> {
use $crate::Builder;
todo!()
@@ -142,7 +154,7 @@ macro_rules! Build {
}
fn from_value(value: Self::ValueT) -> Self::T {
- value.0
+ value.0.0
}
}
};
@@ -156,27 +168,32 @@ 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
+ effectful::bound::Dynamic<$name>: effectful::environment::DynBind<E>,
+ $($value: $crate::Build<'ctx, M, E>,)*
+ $(<<$value as Build<'ctx, M, E>>::Builder as BuilderTypes<E>>::Seed: Default,)*
+ $crate::builders::core::r#enum::EnumBuilder<'ctx, __Info, M, E>: $crate::Builder<'ctx, E, Value = Self>
+ {
type Builder = $crate::builders::core::r#enum::EnumBuilder<'ctx, __Info, M, E>;
}
+ #[derive(SendSync)]
$vis struct __Info;
- $vis enum __Builders<'ctx, M, E: effectful::environment::Environment> {
+ #[derive(SendSync)]
+ $vis enum __Builders<'ctx, M, E: effectful::environment::Environment>
+ where
+ $($value: $crate::Build<'ctx, M, E>),*
+ {
$($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)]
+ #[derive(Copy, Clone, SendSync)]
$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 {
@@ -193,24 +210,29 @@ macro_rules! Build {
$(pub const $variant: u32 = __Variants::$variant as u32;)*
}
- $vis struct __ErrorBuilder<'ctx, M, E: Environment> {
+ #[derive(SendSync)]
+ $vis struct __ErrorBuilder<'ctx, M, E: Environment>
+ where
+ $($value: $crate::Build<'ctx, M, E>),*
+ {
$($variant: Option<<<$value as $crate::Build<'ctx, M, E>>::Builder as BuilderTypes<E>>::Error>),*
}
- 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> {
+ #[derive(SendSync)]
+ $vis enum __Error<'ctx, M, E: Environment>
+ where
+ $($value: $crate::Build<'ctx, M, E>),*
+ {
__Guess {
$($variant: <<$value as $crate::Build<'ctx, M, E>>::Builder as BuilderTypes<E>>::Error),*
},
$($variant(<<$value as $crate::Build<'ctx, M, E>>::Builder as BuilderTypes<E>>::Error)),*
}
- 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> {
+ impl<'ctx, M, E: Environment> ::core::fmt::Display for __Error<'ctx, M, E>
+ where
+ $($value: $crate::Build<'ctx, M, E>),*
+ {
fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
match self {
Self::__Guess {
@@ -225,7 +247,10 @@ macro_rules! Build {
}
}
- impl<'ctx, M, E: Environment> ::core::fmt::Debug for __Error<'ctx, M, E> {
+ impl<'ctx, M, E: Environment> ::core::fmt::Debug for __Error<'ctx, M, E>
+ where
+ $($value: $crate::Build<'ctx, M, E>),*
+ {
fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
match self {
Self::__Guess {
@@ -240,7 +265,12 @@ macro_rules! Build {
}
}
- impl<'ctx, M: 'ctx, E: effectful::environment::Environment> $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
+ where
+ effectful::bound::Dynamic<$name>: effectful::environment::DynBind<E>,
+ $($value: $crate::Build<'ctx, M, E>,)*
+ $(<<$value as Build<'ctx, M, E>>::Builder as BuilderTypes<E>>::Seed: Default),*
+ {
type Builders = __Builders<'ctx, M, E>;
type Seed = ();
@@ -266,9 +296,9 @@ macro_rules! Build {
fn finish_builder<'a>(
builder: Self::Builders,
- ) -> NativeForm<'a, Result<Self::T, Self::Error>, E> {
+ ) -> NativeForm<'a, Result<effectful::bound::Dynamic<Self::T>, Self::Error>, E> {
match builder {
- $(__Builders::$variant(builder) => builder.build().map((), |_, value| value.map($name::$variant).map_err(__Error::$variant)).cast()),*
+ $(__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()),*
}
}
@@ -299,20 +329,22 @@ macro_rules! Build {
fn guess_variant<'a>(
seed: Self::Seed,
scope: DynRecoverableScope<'a, 'ctx, E>,
- ) -> NativeForm<'a, Result<Self::T, Self::Error>, E> {
+ ) -> NativeForm<'a, Result<effectful::bound::Dynamic<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(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| {
+ result.map(|x| effectful::bound::Dynamic(X::$variant(
+ <<$value as Build<'ctx, M, E>>::Builder as BuilderTypes<E>>::unwrap_output(x)
+ ))).map_err(|err| {
error.$variant = Some(err);
error
})