Diffstat (limited to 'src/build/builders/core/enum.rs')
-rw-r--r--src/build/builders/core/enum.rs54
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,