Diffstat (limited to 'src/build/builders/core/enum.rs')
| -rw-r--r-- | src/build/builders/core/enum.rs | 154 |
1 files changed, 81 insertions, 73 deletions
diff --git a/src/build/builders/core/enum.rs b/src/build/builders/core/enum.rs index 4ca0a83..dd5b0b8 100644 --- a/src/build/builders/core/enum.rs +++ b/src/build/builders/core/enum.rs @@ -1,9 +1,10 @@ use core::fmt::{Debug, Display}; use effectful::bound::Dynamic; -use effectful::effective::Effective; -use effectful::environment::{DynBind, Environment, NativeForm}; +use effectful::effective::{Effective, Canonical}; +use effectful::environment::{Environment}; use effectful::SendSync; +use effectful::DynBind; use crate::any::{type_name, OwnedStatic, TempBorrowedStatic}; use crate::protocol::visitor::{DynRecoverableScope, Recoverable}; @@ -20,17 +21,17 @@ use crate::{ }; #[derive(SendSync)] -pub struct EnumBuilder<'ctx, Info, Mode, E: Environment> +pub struct EnumBuilder<'lt, 'ctx, Info, Mode, E: Environment> where - Info: EnumBuildInfo<'ctx, Mode, E>, + Info: EnumBuildInfo<'lt, 'ctx, Mode, E>, { - inner: Inner<'ctx, Info, Mode, E>, + inner: Inner<'lt, 'ctx, Info, Mode, E>, } #[derive(SendSync)] -enum Inner<'ctx, Info, Mode, E: Environment> +enum Inner<'lt, 'ctx, Info, Mode, E: Environment> where - Info: EnumBuildInfo<'ctx, Mode, E>, + Info: EnumBuildInfo<'lt, 'ctx, Mode, E>, { Temp, Seed(Info::Seed), @@ -38,7 +39,7 @@ where Value(Result<Dynamic<Info::T>, Info::Error>), } -pub trait EnumBuildInfo<'ctx, Mode, E: Environment> { +pub trait EnumBuildInfo<'lt, 'ctx, Mode, E: Environment>: 'lt { type Builders: DynBind<E>; type Seed: DynBind<E>; @@ -54,17 +55,17 @@ pub trait EnumBuildInfo<'ctx, Mode, E: Environment> { fn new_builder<'a>( seed: Self::Seed, variant: Self::VariantMarker, - ) -> NativeForm<'a, Self::Builders, E>; + ) -> Canonical<'a, Self::Builders, E>; fn finish_builder<'a>( builder: Self::Builders, - ) -> NativeForm<'a, Result<Dynamic<Self::T>, Self::Error>, E> + ) -> Canonical<'a, Result<Dynamic<Self::T>, Self::Error>, E> where Dynamic<Self::T>: DynBind<E>; fn from_value<'a>(value: type_name::Lowered<'a, 'ctx, Self::ValueT>) -> Self::T; - fn as_visitor<'a>(builder: &'a mut Self::Builders) -> DynVisitor<'a, 'ctx, E>; + fn as_visitor<'a>(builder: &'a mut Self::Builders) -> DynVisitor<'a, 'lt, 'ctx, E>; fn marker_from_name(name: &str) -> Option<Self::VariantMarker>; @@ -73,14 +74,14 @@ pub trait EnumBuildInfo<'ctx, Mode, E: Environment> { fn guess_variant<'a>( seed: Self::Seed, scope: DynRecoverableScope<'a, 'ctx, E>, - ) -> NativeForm<'a, Result<Dynamic<Self::T>, Self::Error>, E> + ) -> Canonical<'a, Result<Dynamic<Self::T>, Self::Error>, E> where Dynamic<Self::T>: DynBind<E>; } -impl<'ctx, Info, Mode, E: Environment> BuilderTypes<E> for EnumBuilder<'ctx, Info, Mode, E> +impl<'lt, 'ctx, Info, Mode, E: Environment> BuilderTypes<E> for EnumBuilder<'lt, 'ctx, Info, Mode, E> where - Info: EnumBuildInfo<'ctx, Mode, E>, + Info: EnumBuildInfo<'lt, 'ctx, Mode, E>, Dynamic<Info::T>: DynBind<E>, { type Seed = Info::Seed; @@ -96,15 +97,15 @@ where } } -impl<'ctx, Info, Mode, E: Environment> Builder<'ctx, E> for EnumBuilder<'ctx, Info, Mode, E> +impl<'lt, 'ctx, Info, Mode: 'lt, E: Environment> Builder<'lt, 'ctx, E> for EnumBuilder<'lt, 'ctx, Info, Mode, E> where - Info: EnumBuildInfo<'ctx, Mode, E>, + Info: EnumBuildInfo<'lt, 'ctx, Mode, E>, Dynamic<Info::T>: DynBind<E>, for<'a> Dynamic<type_name::Lowered<'a, 'ctx, Info::ValueT>>: DynBind<E>, for<'a> Dynamic<TempBorrowedStatic<'a, str>>: DynBind<E>, Dynamic<OwnedStatic<u32>>: DynBind<E>, { - fn from_seed<'a>(seed: Self::Seed) -> NativeForm<'a, Self, E> + fn from_seed<'a>(seed: Self::Seed) -> Canonical<'a, Self, E> where Self: 'a, { @@ -114,7 +115,7 @@ where .cast() } - fn build<'a>(self) -> NativeForm<'a, Result<Self::Output, Self::Error>, E> + fn build<'a>(self) -> Canonical<'a, Result<Self::Output, Self::Error>, E> where Self: 'a, { @@ -130,26 +131,23 @@ where } } -impl<'ctx, Info, Mode, E: Environment> AsVisitor<'ctx, E> for EnumBuilder<'ctx, Info, Mode, E> +impl<'lt, 'ctx, Info, Mode: 'lt, E: Environment> AsVisitor<'lt, 'ctx, E> for EnumBuilder<'lt, 'ctx, Info, Mode, E> where - Info: EnumBuildInfo<'ctx, Mode, E>, + Info: EnumBuildInfo<'lt, 'ctx, Mode, E>, Dynamic<Info::T>: DynBind<E>, for<'a> Dynamic<type_name::Lowered<'a, 'ctx, Info::ValueT>>: DynBind<E>, for<'a> Dynamic<TempBorrowedStatic<'a, str>>: DynBind<E>, Dynamic<OwnedStatic<u32>>: DynBind<E>, { - fn as_visitor<'a>(&'a mut self) -> DynVisitor<'a, 'ctx, E> - where - 'ctx: 'a, - { + fn as_visitor<'a>(&'a mut self) -> DynVisitor<'a, 'lt, 'ctx, E> { DynVisitor(self) } } -impl<'ctx, Info, Mode, E: Environment> AnyTrait<'ctx> for EnumBuilder<'ctx, Info, Mode, E> +impl<'lt, 'ctx: 'lt, Info, Mode: 'lt, E: Environment> AnyTrait<'lt, 'ctx> for EnumBuilder<'lt, 'ctx, Info, Mode, E> where E: Environment, - Info: EnumBuildInfo<'ctx, Mode, E>, + Info: EnumBuildInfo<'lt, 'ctx, Mode, E>, Dynamic<Info::T>: DynBind<E>, for<'a> Dynamic<type_name::Lowered<'a, 'ctx, Info::ValueT>>: DynBind<E>, for<'a> Dynamic<TempBorrowedStatic<'a, str>>: DynBind<E>, @@ -189,15 +187,15 @@ where // Dynamic<OwnedStatic<u32>>: DynBind<E>, // } -impl<'ctx, Info, Mode, E: Environment> Recoverable<'ctx, E> for EnumBuilder<'ctx, Info, Mode, E> +impl<'lt, 'ctx, Info, Mode, E: Environment> Recoverable<'ctx, E> for EnumBuilder<'lt, 'ctx, Info, Mode, E> where - Info: EnumBuildInfo<'ctx, Mode, E>, + Info: EnumBuildInfo<'lt, 'ctx, Mode, E>, Dynamic<Info::T>: DynBind<E>, { fn visit<'a>( &'a mut self, scope: DynRecoverableScope<'a, 'ctx, E>, - ) -> NativeForm<'a, VisitResult, E> { + ) -> Canonical<'a, VisitResult, E> { match core::mem::replace(&mut self.inner, Inner::Temp) { Inner::Seed(seed) => Info::guess_variant(seed, scope) .map(self, |this, result| { @@ -213,16 +211,16 @@ where } } -impl<'ctx, Info, Mode, E: Environment> Value<'ctx, Info::ValueT, E> - for EnumBuilder<'ctx, Info, Mode, E> +impl<'lt, 'ctx, Info, Mode, E: Environment> Value<'ctx, Info::ValueT, E> + for EnumBuilder<'lt, 'ctx, Info, Mode, E> where - Info: EnumBuildInfo<'ctx, Mode, E>, + Info: EnumBuildInfo<'lt, 'ctx, Mode, E>, Dynamic<Info::T>: DynBind<E>, { fn visit<'this: 'value, 'value: 'e, 'e>( &'this mut self, value: type_name::Lowered<'value, 'ctx, Info::ValueT>, - ) -> NativeForm<'e, VisitResult<Dynamic<type_name::Lowered<'value, 'ctx, Info::ValueT>>>, E> + ) -> Canonical<'e, VisitResult<Dynamic<type_name::Lowered<'value, 'ctx, Info::ValueT>>>, E> where type_name::Lowered<'value, 'ctx, Info::ValueT>: Sized, Dynamic<type_name::Lowered<'value, 'ctx, Info::ValueT>>: DynBind<E>, @@ -233,61 +231,71 @@ where } } -impl<'ctx, Info, Mode, E: Environment> Tag<'ctx, tags::Variant, E> - for EnumBuilder<'ctx, Info, Mode, E> +impl<'lt, 'ctx: 'lt, Info, Mode: 'lt, E: Environment> Tag<'ctx, tags::Variant, E> + for EnumBuilder<'lt, 'ctx, Info, Mode, E> where - Info: EnumBuildInfo<'ctx, Mode, E>, + Info: EnumBuildInfo<'lt, 'ctx, Mode, E>, Dynamic<Info::T>: DynBind<E>, for<'a> Dynamic<TempBorrowedStatic<'a, str>>: DynBind<E>, Dynamic<OwnedStatic<u32>>: DynBind<E>, { - fn visit<'a: 'c, 'b: 'c, 'c>( + fn visit<'a: 'c, 'b: 'c, 'd: 'b, 'c>( &'a mut self, _kind: tags::Variant, - walker: DynWalkerObjSafe<'b, 'ctx, E>, - ) -> NativeForm<'c, VisitResult, E> { + walker: DynWalkerObjSafe<'b, 'd, 'ctx, E>, + ) -> Canonical<'c, VisitResult, E> + where + 'ctx: 'd + 'b + 'c, + 'lt: 'a + 'c, + { let visitor = VariantVisitor::<Info, Mode, E> { marker: None }; - E::value((visitor, walker)) - .update((), |_, (visitor, walker)| { - walker.walk(DynVisitor(visitor)).cast() - }) - .then(self, |this, ((visitor, _), result)| { - if let Some(variant) = visitor.marker { - match core::mem::replace(&mut this.inner, Inner::Temp) { - // A variant was given so we need to make the builder for - // it. - Inner::Seed(seed) => Info::new_builder(seed, variant) - .map((this, result), |(this, result), builder| { - this.inner = Inner::Builder { builder }; - result.to_done().into() - }) - .cast::<()>(), - inner => { - this.inner = inner; - E::value(result.to_done().into()).cast() - } - } - } else { - E::value(result.to_done().into()).cast() - } - }) - .cast() + E::value(visitor) + .update_map::<'_, '_, _, Flow>(walker, |walker, visitor| { + let y: DynVisitor<'_, 'lt, 'ctx, E> = DynVisitor(visitor); + let walker: DynWalkerObjSafe<'b, 'd, 'ctx, E> = walker; + let x: Canonical<'_, Flow, E> = walker.walk(y); + let y: Canonical<'_, Flow, E, &'_ ()> = x.cast(); + y + // E::value(Flow::Done).cast() + }); + // .then(self, |this, ((visitor, _), result)| { + // if let Some(variant) = visitor.marker { + // match core::mem::replace(&mut this.inner, Inner::Temp) { + // // A variant was given so we need to make the builder for + // // it. + // Inner::Seed(seed) => Info::new_builder(seed, variant) + // .map((this, result), |(this, result), builder| { + // this.inner = Inner::Builder { builder }; + // result.to_done().into() + // }) + // .cast::<()>(), + // inner => { + // this.inner = inner; + // E::value::<VisitResult>(result.to_done().into()).cast() + // } + // } + // } else { + // E::value(result.to_done().into()).cast() + // } + // }); + // .cast() + todo!(); } } #[derive(SendSync)] -struct VariantVisitor<'ctx, Info, Mode, E: Environment> +struct VariantVisitor<'lt, 'ctx, Info, Mode, E: Environment> where - Info: EnumBuildInfo<'ctx, Mode, E>, + Info: EnumBuildInfo<'lt, 'ctx, Mode, E>, { marker: Option<Info::VariantMarker>, } -impl<'ctx, Info, Mode, E: Environment> AnyTrait<'ctx> for VariantVisitor<'ctx, Info, Mode, E> +impl<'lt, 'ctx: 'lt, Info, Mode: 'lt, E: Environment> AnyTrait<'lt, 'ctx> for VariantVisitor<'lt, 'ctx, Info, Mode, E> where E: Environment, - Info: EnumBuildInfo<'ctx, Mode, E>, + Info: EnumBuildInfo<'lt, 'ctx, Mode, E>, Dynamic<OwnedStatic<u32>>: DynBind<E>, for<'a> Dynamic<TempBorrowedStatic<'a, str>>: DynBind<E>, { @@ -314,7 +322,7 @@ where // fn visit<'a>( // &'a mut self, // TempBorrowedStatic(value): TypeName::T<'a, 'ctx, TempBorrowedStaticHrt<str>, E>, -// ) -> NativeForm<'a, VisitResult<Dynamic<TypeName::T<'a, 'ctx, TempBorrowedStaticHrt<str>, E>>>, E> +// ) -> Canonical<'a, VisitResult<Dynamic<TypeName::T<'a, 'ctx, TempBorrowedStaticHrt<str>, E>>>, E> // where // TypeName::T<'a, 'ctx, TempBorrowedStaticHrt<str>, E>: Sized, // 'ctx: 'a, @@ -329,17 +337,17 @@ where // } // } -impl<'ctx, Info, Mode, E: Environment> Value<'ctx, OwnedStatic<u32>, E> - for VariantVisitor<'ctx, Info, Mode, E> +impl<'lt, 'ctx, Info, Mode, E: Environment> Value<'ctx, OwnedStatic<u32>, E> + for VariantVisitor<'lt, 'ctx, Info, Mode, E> where - Info: EnumBuildInfo<'ctx, Mode, E>, + Info: EnumBuildInfo<'lt, 'ctx, Mode, E>, for<'a> Dynamic<type_name::Lowered<'a, 'ctx, OwnedStatic<u32>>>: DynBind<E>, Dynamic<OwnedStatic<u32>>: DynBind<E>, { fn visit<'this: 'value, 'value: 'e, 'e>( &'this mut self, value: type_name::Lowered<'value, 'ctx, OwnedStatic<u32>>, - ) -> NativeForm<'e, VisitResult<Dynamic<type_name::Lowered<'value, 'ctx, OwnedStatic<u32>>>>, E> + ) -> Canonical<'e, VisitResult<Dynamic<type_name::Lowered<'value, 'ctx, OwnedStatic<u32>>>>, E> where type_name::Lowered<'value, 'ctx, OwnedStatic<u32>>: Sized, Dynamic<type_name::Lowered<'value, 'ctx, OwnedStatic<u32>>>: DynBind<E>, |