Diffstat (limited to 'src/build/builders/core/enum.rs')
| -rw-r--r-- | src/build/builders/core/enum.rs | 54 |
1 files changed, 44 insertions, 10 deletions
diff --git a/src/build/builders/core/enum.rs b/src/build/builders/core/enum.rs index da66e9d..4294fff 100644 --- a/src/build/builders/core/enum.rs +++ b/src/build/builders/core/enum.rs @@ -1,6 +1,6 @@ use core::fmt::{Debug, Display}; -use effectful::bound::{Bool, IsSend, IsSync}; +use effectful::bound::{Bool, IsSend, IsSync, Dynamic}; use effectful::effective::Effective; use effectful::environment::{DynBind, Environment, NativeForm}; use effectful::higher_ranked::Mut; @@ -36,7 +36,7 @@ where Temp, Seed(Info::Seed), Builder { builder: Info::Builders }, - Value(Result<Info::T, Info::Error>), + Value(Result<Dynamic<Info::T>, Info::Error>), } pub trait EnumBuildInfo<'ctx, Mode, E: Environment> { @@ -48,7 +48,7 @@ pub trait EnumBuildInfo<'ctx, Mode, E: Environment> { type ValueT: TypeName::MemberType<E>; - type T: DynBind<E>; + type T; type VariantMarker: DynBind<E> + Copy + Display; @@ -59,7 +59,9 @@ pub trait EnumBuildInfo<'ctx, Mode, E: Environment> { fn finish_builder<'a>( builder: Self::Builders, - ) -> NativeForm<'a, Result<Self::T, Self::Error>, E>; + ) -> NativeForm<'a, Result<Dynamic<Self::T>, Self::Error>, E> + where + Dynamic<Self::T>: DynBind<E>; fn from_value<'a>(value: TypeName::T<'a, 'ctx, Self::ValueT, E>) -> Self::T; @@ -72,23 +74,36 @@ pub trait EnumBuildInfo<'ctx, Mode, E: Environment> { fn guess_variant<'a>( seed: Self::Seed, scope: DynRecoverableScope<'a, 'ctx, E>, - ) -> NativeForm<'a, Result<Self::T, Self::Error>, E>; + ) -> NativeForm<'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> where Info: EnumBuildInfo<'ctx, Mode, E>, + Dynamic<Info::T>: DynBind<E> { type Seed = Info::Seed; type Error = Info::Error; type Value = Info::T; + + type Output = Dynamic<Info::T>; + + fn unwrap_output(output: Self::Output) -> Self::Value { + output.0 + } } impl<'ctx, Info, Mode, E: Environment> Builder<'ctx, E> for EnumBuilder<'ctx, Info, Mode, E> where Info: EnumBuildInfo<'ctx, Mode, E>, + Dynamic<Info::T>: DynBind<E>, + for<'a> Dynamic<TypeName::T<'a, 'ctx, Info::ValueT, E>>: 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> where @@ -100,7 +115,7 @@ where .cast() } - fn build<'a>(self) -> NativeForm<'a, Result<Self::Value, Self::Error>, E> + fn build<'a>(self) -> NativeForm<'a, Result<Self::Output, Self::Error>, E> where Self: 'a, { @@ -119,6 +134,10 @@ where impl<'ctx, Info, Mode, E: Environment> AsVisitor<'ctx, E> for EnumBuilder<'ctx, Info, Mode, E> where Info: EnumBuildInfo<'ctx, Mode, E>, + Dynamic<Info::T>: DynBind<E>, + for<'a> Dynamic<TypeName::T<'a, 'ctx, Info::ValueT, E>>: 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 @@ -154,11 +173,16 @@ any_trait! { } where E: Environment, Info: EnumBuildInfo<'ctx, Mode, E>, + Dynamic<Info::T>: DynBind<E>, + for<'a> Dynamic<TypeName::T<'a, 'ctx, Info::ValueT, E>>: DynBind<E>, + for<'a> Dynamic<TempBorrowedStatic<'a, str>>: DynBind<E>, + Dynamic<OwnedStatic<u32>>: DynBind<E>, } impl<'ctx, Info, Mode, E: Environment> Recoverable<'ctx, E> for EnumBuilder<'ctx, Info, Mode, E> where Info: EnumBuildInfo<'ctx, Mode, E>, + Dynamic<Info::T>: DynBind<E>, { fn visit<'a>( &'a mut self, @@ -183,16 +207,18 @@ impl<'ctx, Info, Mode, E: Environment> Value<'ctx, Info::ValueT, E> for EnumBuilder<'ctx, Info, Mode, E> where Info: EnumBuildInfo<'ctx, Mode, E>, + Dynamic<Info::T>: DynBind<E>, + for<'a> Dynamic<TypeName::T<'a, 'ctx, Info::ValueT, E>>: DynBind<E> { fn visit<'a>( &'a mut self, value: TypeName::T<'a, 'ctx, Info::ValueT, E>, - ) -> NativeForm<'a, VisitResult<TypeName::T<'a, 'ctx, Info::ValueT, E>>, E> + ) -> NativeForm<'a, VisitResult<Dynamic<TypeName::T<'a, 'ctx, Info::ValueT, E>>>, E> where TypeName::T<'a, 'ctx, Info::ValueT, E>: Sized, 'ctx: 'a, { - self.inner = Inner::Value(Ok(Info::from_value(value))); + self.inner = Inner::Value(Ok(Dynamic(Info::from_value(value)))); E::value(Flow::Done.into()).cast() } } @@ -201,6 +227,9 @@ impl<'ctx, Info, Mode, E: Environment> Tag<'ctx, tags::Variant, E> for EnumBuilder<'ctx, Info, Mode, E> where Info: EnumBuildInfo<'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>( &'a mut self, @@ -253,17 +282,20 @@ any_trait! { where E: Environment, Info: EnumBuildInfo<'ctx, Mode, E>, + Dynamic<OwnedStatic<u32>>: DynBind<E>, + for<'a> Dynamic<TempBorrowedStatic<'a, str>>: DynBind<E>, } impl<'ctx, Info, Mode, E: Environment> Value<'ctx, TempBorrowedStaticHrt<str>, E> for VariantVisitor<'ctx, Info, Mode, E> where Info: EnumBuildInfo<'ctx, Mode, E>, + for<'a> Dynamic<TypeName::T<'a, 'ctx, TempBorrowedStaticHrt<str>, E>>: DynBind<E>, { fn visit<'a>( &'a mut self, TempBorrowedStatic(value): TypeName::T<'a, 'ctx, TempBorrowedStaticHrt<str>, E>, - ) -> NativeForm<'a, VisitResult<TypeName::T<'a, 'ctx, TempBorrowedStaticHrt<str>, E>>, E> + ) -> NativeForm<'a, VisitResult<Dynamic<TypeName::T<'a, 'ctx, TempBorrowedStaticHrt<str>, E>>>, E> where TypeName::T<'a, 'ctx, TempBorrowedStaticHrt<str>, E>: Sized, 'ctx: 'a, @@ -282,11 +314,13 @@ impl<'ctx, Info, Mode, E: Environment> Value<'ctx, OwnedStatic<u32>, E> for VariantVisitor<'ctx, Info, Mode, E> where Info: EnumBuildInfo<'ctx, Mode, E>, + for<'a> Dynamic<TypeName::T<'a, 'ctx, OwnedStatic<u32>, E>>: DynBind<E>, + Dynamic<OwnedStatic<u32>>: DynBind<E>, { fn visit<'a>( &'a mut self, OwnedStatic(value): TypeName::T<'a, 'ctx, OwnedStatic<u32>, E>, - ) -> NativeForm<'a, VisitResult<TypeName::T<'a, 'ctx, OwnedStatic<u32>, E>>, E> + ) -> NativeForm<'a, VisitResult<Dynamic<TypeName::T<'a, 'ctx, OwnedStatic<u32>, E>>>, E> where TypeName::T<'a, 'ctx, OwnedStatic<u32>, E>: Sized, 'ctx: 'a, |