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