Diffstat (limited to 'src/build/builders/core/enum.rs')
-rw-r--r--src/build/builders/core/enum.rs200
1 files changed, 110 insertions, 90 deletions
diff --git a/src/build/builders/core/enum.rs b/src/build/builders/core/enum.rs
index 7aff4cf..4ca0a83 100644
--- a/src/build/builders/core/enum.rs
+++ b/src/build/builders/core/enum.rs
@@ -1,23 +1,22 @@
use core::fmt::{Debug, Display};
-use effectful::bound::{Bool, Dynamic, IsSend, IsSync};
+use effectful::bound::Dynamic;
use effectful::effective::Effective;
use effectful::environment::{DynBind, Environment, NativeForm};
-use effectful::higher_ranked::Mut;
use effectful::SendSync;
-use crate::any::{OwnedStatic, TempBorrowedStatic, TempBorrowedStaticHrt};
-use crate::protocol::visitor::{DynRecoverableScope, Recoverable, RecoverableProto};
+use crate::any::{type_name, OwnedStatic, TempBorrowedStatic};
+use crate::protocol::visitor::{DynRecoverableScope, Recoverable};
use crate::protocol::AsVisitor;
use crate::{
- any::{AnyTraitObject, TypeName, TypeNameId},
- any_trait,
- hkt::Invariant,
+ any::AnyTrait,
+ build::BuilderTypes,
protocol::{
- visitor::{tags, Tag, TagProto, Value, ValueProto, VisitResult},
+ visitor::{tags, Tag, Value, VisitResult},
DynVisitor,
},
- Builder, BuilderTypes, DynWalkerObjSafe, Flow,
+ walk::DynWalkerObjSafe,
+ Builder, Flow,
};
#[derive(SendSync)]
@@ -46,7 +45,7 @@ pub trait EnumBuildInfo<'ctx, Mode, E: Environment> {
type Error: DynBind<E> + Debug + Display;
- type ValueT: TypeName::MemberType<E>;
+ type ValueT: type_name::Static;
type T;
@@ -63,7 +62,7 @@ pub trait EnumBuildInfo<'ctx, Mode, E: Environment> {
where
Dynamic<Self::T>: DynBind<E>;
- fn from_value<'a>(value: TypeName::T<'a, 'ctx, Self::ValueT, E>) -> Self::T;
+ 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>;
@@ -101,7 +100,7 @@ impl<'ctx, Info, Mode, E: Environment> Builder<'ctx, E> for EnumBuilder<'ctx, In
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<type_name::Lowered<'a, 'ctx, Info::ValueT>>: DynBind<E>,
for<'a> Dynamic<TempBorrowedStatic<'a, str>>: DynBind<E>,
Dynamic<OwnedStatic<u32>>: DynBind<E>,
{
@@ -121,7 +120,7 @@ where
{
match self.inner {
Inner::Temp => unreachable!(),
- Inner::Seed(seed) => {
+ Inner::Seed(_seed) => {
// what to do...
todo!()
}
@@ -135,7 +134,7 @@ impl<'ctx, Info, Mode, E: Environment> AsVisitor<'ctx, E> for EnumBuilder<'ctx,
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<type_name::Lowered<'a, 'ctx, Info::ValueT>>: DynBind<E>,
for<'a> Dynamic<TempBorrowedStatic<'a, str>>: DynBind<E>,
Dynamic<OwnedStatic<u32>>: DynBind<E>,
{
@@ -147,38 +146,49 @@ where
}
}
-any_trait! {
- impl['ctx, Info, Mode][E] EnumBuilder<'ctx, Info, Mode, E> = [
- ValueProto<Info::ValueT, E>,
- TagProto<tags::Variant, E>,
- RecoverableProto<E>
- ] ref {
- let (_this, _id);
- } else ref {
- None
- } mut {
- let (this, id);
-
- // If a variant has been chosen, then forward everything to it's builder.
- if matches!(this.inner, Inner::Builder { .. }) {
- match &mut this.inner {
- Inner::Builder { builder } => {
- return Info::as_visitor(builder).0.upcast_to_id_mut(id)
- }
- _ => unreachable!(),
- }
- }
- } else mut {
- None
- } 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> AnyTrait<'ctx> for EnumBuilder<'ctx, Info, Mode, E>
+where
+ E: Environment,
+ Info: EnumBuildInfo<'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>,
+{
}
+// any_trait! {
+// impl['ctx, Info, Mode][E] EnumBuilder<'ctx, Info, Mode, E> = [
+// ValueProto<Info::ValueT, E>,
+// TagProto<tags::Variant, E>,
+// RecoverableProto<E>
+// ] ref {
+// let (_this, _id);
+// } else ref {
+// None
+// } mut {
+// let (this, id);
+//
+// // If a variant has been chosen, then forward everything to it's builder.
+// if matches!(this.inner, Inner::Builder { .. }) {
+// match &mut this.inner {
+// Inner::Builder { builder } => {
+// return Info::as_visitor(builder).0.upcast_to_id_mut(id)
+// }
+// _ => unreachable!(),
+// }
+// }
+// } else mut {
+// None
+// } 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>,
@@ -208,15 +218,15 @@ impl<'ctx, Info, Mode, E: Environment> Value<'ctx, Info::ValueT, 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<Dynamic<TypeName::T<'a, 'ctx, Info::ValueT, E>>>, 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>
where
- TypeName::T<'a, 'ctx, Info::ValueT, E>: Sized,
- 'ctx: 'a,
+ type_name::Lowered<'value, 'ctx, Info::ValueT>: Sized,
+ Dynamic<type_name::Lowered<'value, 'ctx, Info::ValueT>>: DynBind<E>,
+ 'ctx: 'this + 'value,
{
self.inner = Inner::Value(Ok(Dynamic(Info::from_value(value))));
E::value(Flow::Done.into()).cast()
@@ -274,58 +284,68 @@ where
marker: Option<Info::VariantMarker>,
}
-any_trait! {
- impl['ctx, Info, Mode][E] VariantVisitor<'ctx, Info, Mode, E> = [
- ValueProto<TempBorrowedStaticHrt<str>, E>,
- ValueProto<OwnedStatic<u32>, E>,
- ]
- 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>
+impl<'ctx, Info, Mode, E: Environment> AnyTrait<'ctx> for VariantVisitor<'ctx, Info, Mode, E>
where
+ E: Environment,
Info: EnumBuildInfo<'ctx, Mode, E>,
- for<'a> Dynamic<TypeName::T<'a, 'ctx, TempBorrowedStaticHrt<str>, E>>: DynBind<E>,
+ Dynamic<OwnedStatic<u32>>: DynBind<E>,
+ for<'a> Dynamic<TempBorrowedStatic<'a, str>>: DynBind<E>,
{
- 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>
- where
- TypeName::T<'a, 'ctx, TempBorrowedStaticHrt<str>, E>: Sized,
- 'ctx: 'a,
- {
- if let Some(variant) = Info::marker_from_name(value) {
- self.marker = Some(variant);
-
- E::value(Flow::Done.into()).cast()
- } else {
- E::value(Flow::Continue.into()).cast()
- }
- }
}
+// any_trait! {
+// impl['ctx, Info, Mode][E] VariantVisitor<'ctx, Info, Mode, E> = [
+// ValueProto<TempBorrowedStaticHrt<str>, E>,
+// ValueProto<OwnedStatic<u32>, E>,
+// ]
+// 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<Dynamic<TypeName::T<'a, 'ctx, TempBorrowedStaticHrt<str>, E>>>, E>
+// where
+// TypeName::T<'a, 'ctx, TempBorrowedStaticHrt<str>, E>: Sized,
+// 'ctx: 'a,
+// {
+// if let Some(variant) = Info::marker_from_name(value) {
+// self.marker = Some(variant);
+//
+// E::value(Flow::Done.into()).cast()
+// } else {
+// E::value(Flow::Continue.into()).cast()
+// }
+// }
+// }
+
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>,
+ for<'a> Dynamic<type_name::Lowered<'a, 'ctx, OwnedStatic<u32>>>: 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<Dynamic<TypeName::T<'a, 'ctx, OwnedStatic<u32>, E>>>, 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>
where
- TypeName::T<'a, 'ctx, OwnedStatic<u32>, E>: Sized,
- 'ctx: 'a,
+ type_name::Lowered<'value, 'ctx, OwnedStatic<u32>>: Sized,
+ Dynamic<type_name::Lowered<'value, 'ctx, OwnedStatic<u32>>>: DynBind<E>,
+ 'ctx: 'this + 'value,
{
- if let Some(variant) = Info::marker_from_discriminant(value) {
+ if let Some(variant) = Info::marker_from_discriminant(value.0) {
self.marker = Some(variant);
E::value(Flow::Done.into()).cast()