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