Diffstat (limited to 'src/macros/build.rs')
-rw-r--r--src/macros/build.rs77
1 files changed, 46 insertions, 31 deletions
diff --git a/src/macros/build.rs b/src/macros/build.rs
index b02c123..2f7e228 100644
--- a/src/macros/build.rs
+++ b/src/macros/build.rs
@@ -9,19 +9,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
+ where
+ $name: effectful::environment::DynBind<E> + effectful::bound::IsSync<E::NeedSend>
+ {
type Builder = $crate::builders::core::r#struct::StructBuilder<'ctx, __Info, M, E>;
}
- $vis struct Builders<'ctx, M: 'ctx, E: $crate::effect::Effect> {
+ $vis struct Builders<'ctx, M: 'ctx, E: effectful::environment::Environment> {
$($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)]
$vis enum Field {
$($field),*
}
+ effectful::is_send_sync!(Field);
+
mod field_index {
enum __Fields {
$($field),*
@@ -30,10 +38,13 @@ macro_rules! Build {
$(pub const $field: usize = __Fields::$field as usize;)*
}
- $vis enum Error<'ctx, M: 'ctx, E: $crate::effect::Effect> {
- $($field(<<$type as $crate::Build<'ctx, M, E>>::Builder as $crate::BuilderTypes>::Error)),*
+ $vis enum Error<'ctx, M: 'ctx, E: effectful::environment::Environment> {
+ $($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 {
@@ -42,7 +53,7 @@ macro_rules! Build {
}
}
- impl<'ctx, M: 'ctx, E: $crate::effect::Effect> ::core::fmt::Debug for Error<'ctx, M, E> {
+ impl<'ctx, M: 'ctx, E: effectful::environment::Environment> ::core::fmt::Debug for Error<'ctx, M, E> {
fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
f.write_str(match self {
$(Error::$field(_) => stringify!($field)),*
@@ -50,7 +61,7 @@ macro_rules! Build {
}
}
- impl<'ctx, M: 'ctx, E: $crate::effect::Effect> ::core::fmt::Display for Error<'ctx, M, E> {
+ impl<'ctx, M: 'ctx, E: effectful::environment::Environment> ::core::fmt::Display for Error<'ctx, M, E> {
fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
f.write_str(match self {
$(Error::$field(_) => stringify!($field)),*
@@ -60,12 +71,15 @@ macro_rules! Build {
$vis struct __Info;
- impl<'ctx, M: 'ctx, E: $crate::effect::Effect> $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>
+ {
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>::Seed),*);
+ type Seed = ($(<<$type as $crate::Build<'ctx, M, E>>::Builder as $crate::BuilderTypes<E>>::Seed),*);
type ValueT = $crate::any::OwnedStatic<$name>;
const FIELD_COUNT: usize = {
@@ -73,40 +87,41 @@ macro_rules! Build {
};
#[inline(always)]
- fn new_builders<'a>(seed: Self::Seed) -> $crate::effect::ErasedEffective<'a, Self::Builders, E> {
+ fn new_builders<'a>(seed: Self::Seed) -> effectful::environment::NativeForm<'a, Self::Builders, E> {
let ($($field),*) = seed;
- use $crate::effect::EffectiveExt;
+ todo!()
- $crate::effect::join(
- ($(<<$type as $crate::Build<'ctx, M, E>>::Builder as $crate::Builder::<E>>::from_seed($field),)*)
- ).map(|($($field,)*)| {
- Builders {
- $($field),*
- }
- })
+ // $crate::effect::join(
+ // ($(<<$type as $crate::Build<'ctx, M, E>>::Builder as $crate::Builder::<E>>::from_seed($field),)*)
+ // ).map(|($($field,)*)| {
+ // Builders {
+ // $($field),*
+ // }
+ // })
}
- fn from_builders<'a>(builders: Self::Builders) -> $crate::effect::ErasedEffective<'a, Result<Self::T, Self::Error>, E> {
+ fn from_builders<'a>(builders: Self::Builders) -> effectful::environment::NativeForm<'a, Result<Self::T, Self::Error>, E> {
use $crate::Builder;
- use $crate::effect::EffectiveExt;
-
- $crate::effect::try_join(
- (
- $(|| builders.$field.build().map(|x| x.map_err(Error::$field)),)*
- )
- ).map(|result| match result {
- Ok(($($field,)*)) => Ok($name {
- $($field),*
- }),
- Err(err) => Err(err)
- })
+
+ todo!()
+
+ // $crate::effect::try_join(
+ // (
+ // $(|| builders.$field.build().map(|x| x.map_err(Error::$field)),)*
+ // )
+ // ).map(|result| match result {
+ // Ok(($($field,)*)) => Ok($name {
+ // $($field),*
+ // }),
+ // Err(err) => Err(err)
+ // })
}
fn as_visitor<'a>(
marker: Self::FieldMarker,
builders: &'a mut Self::Builders,
- ) -> $crate::protocol::DynVisitor<'a, 'ctx> {
+ ) -> $crate::protocol::DynVisitor<'a, 'ctx, E> {
use $crate::protocol::AsVisitor;
match marker {