Diffstat (limited to 'src/build/builders/core/value.rs')
| -rw-r--r-- | src/build/builders/core/value.rs | 356 |
1 files changed, 221 insertions, 135 deletions
diff --git a/src/build/builders/core/value.rs b/src/build/builders/core/value.rs index feec981..310e337 100644 --- a/src/build/builders/core/value.rs +++ b/src/build/builders/core/value.rs @@ -2,29 +2,23 @@ use core::fmt::Display; use effectful::{ bound::Dynamic, - bound::IsSync, effective::Effective, environment::{DynBind, Environment, NativeForm}, - higher_ranked::Mut, SendSync, }; use crate::{ any::{ - AnyTrait, BorrowedMutStatic, BorrowedMutStaticHrt, BorrowedStatic, BorrowedStaticHrt, - OwnedStatic, TempBorrowedMutStatic, TempBorrowedMutStaticHrt, TempBorrowedStatic, - TempBorrowedStaticHrt, + type_name, AnyTrait, BorrowedMutStatic, BorrowedStatic, OwnedStatic, TempBorrowedMutStatic, + TempBorrowedStatic, }, - any_trait, hkt::Marker, protocol::{ - visitor::{ - EffectiveVisitExt as _, RequestHint, RequestHintProto, Value, ValueProto, VisitResult, - }, + visitor::{EffectiveVisitExt as _, RequestHint, Value, VisitResult}, walker::hint::hint_protocol, AsVisitor, DynVisitor, DynWalker, }, - Flow, + trait_by_id, Flow, }; #[derive(SendSync)] @@ -59,7 +53,7 @@ pub struct ValueBuilder<T, Clone, E> { _marker: Marker<(E, Clone)>, } -impl<T, Clone, E: Environment> crate::BuilderTypes<E> for ValueBuilder<T, Clone, E> +impl<T, Clone, E: Environment> crate::build::BuilderTypes<E> for ValueBuilder<T, Clone, E> where Dynamic<T>: DynBind<E>, { @@ -79,7 +73,7 @@ where impl<'ctx, T: 'static, Clone, E: Environment> crate::Builder<'ctx, E> for ValueBuilder<T, Clone, E> where Dynamic<T>: DynBind<E>, - Self: AnyTrait<'ctx, E>, + Self: AnyTrait<'ctx>, { fn build<'a>(self) -> NativeForm<'a, Result<Self::Output, Self::Error>, E> where @@ -102,7 +96,7 @@ where impl<'ctx, T: 'static, Clone, E: Environment> AsVisitor<'ctx, E> for ValueBuilder<T, Clone, E> where - Self: AnyTrait<'ctx, E>, + Self: AnyTrait<'ctx> + DynBind<E>, { fn as_visitor<'a>(&'a mut self) -> DynVisitor<'a, 'ctx, E> where @@ -112,44 +106,97 @@ where } } -any_trait! { - impl['ctx, T][E] ValueBuilder<T, NotCloneable, E> = [ - RequestHintProto<E>, - ValueProto<OwnedStatic<T>, E>, - ] where - E: Environment, - T: 'static, - Dynamic<T>: DynBind<E>, - for<'a> Dynamic<&'a T>: DynBind<E>, - Dynamic<OwnedStatic<T>>: DynBind<E>, - for<'a> Dynamic<&'a OwnedStatic<T>>: DynBind<E>, +impl<'ctx, T: 'static, E: Environment> AnyTrait<'ctx> for ValueBuilder<T, NotCloneable, E> +where + Dynamic<T>: DynBind<E>, + for<'a> Dynamic<&'a T>: DynBind<E>, + Dynamic<OwnedStatic<T>>: DynBind<E>, + for<'a> Dynamic<&'a OwnedStatic<T>>: DynBind<E>, +{ + fn upcast_by_id_mut<'a, 'lt: 'a>( + &'a mut self, + id: crate::any::WithLtTypeId<'lt, 'ctx>, + ) -> Option<crate::any::MutAnyUnsized<'a, 'lt, 'ctx>> + where + 'ctx: 'lt, + { + trait_by_id!(&mut self, id, { + type Impls<'lt, 'ctx> = (dyn RequestHint<'ctx, E>, dyn Value<'ctx, OwnedStatic<T>, E>); + + None + }) + } } -any_trait! { - impl['ctx, T][E] ValueBuilder<T, Cloneable, E> = [ - RequestHintProto<E>, - ValueProto<OwnedStatic<T>, E>, - ValueProto<BorrowedStaticHrt<T>, E>, - ValueProto<TempBorrowedStaticHrt<T>, E>, - ValueProto<BorrowedMutStaticHrt<T>, E>, - ValueProto<TempBorrowedMutStaticHrt<T>, E>, - ] where - E: Environment, - T: 'static + Clone, - Dynamic<T>: DynBind<E>, - for<'a> Dynamic<&'a T>: DynBind<E>, - for<'a> Dynamic<&'a OwnedStatic<T>>: DynBind<E>, - Dynamic<OwnedStatic<T>>: DynBind<E>, - Dynamic<BorrowedStatic<'ctx, T>>: DynBind<E>, - for<'a, 'b> Dynamic<&'a BorrowedStatic<'b, T>>: DynBind<E>, - for<'a> Dynamic<TempBorrowedStatic<'a, T>>: DynBind<E>, - for<'a> Dynamic<&'a TempBorrowedStatic<'a, T>>: DynBind<E>, - Dynamic<BorrowedMutStatic<'ctx, T>>: DynBind<E>, - for<'a, 'b> Dynamic<&'a BorrowedMutStatic<'b, T>>: DynBind<E>, - for<'a> Dynamic<TempBorrowedMutStatic<'a, T>>: DynBind<E>, - for<'a> Dynamic<&'a TempBorrowedMutStatic<'a, T>>: DynBind<E>, +impl<'ctx, T: 'static + Clone, E: Environment> AnyTrait<'ctx> for ValueBuilder<T, Cloneable, E> +where + Dynamic<T>: DynBind<E>, + for<'a> Dynamic<&'a T>: DynBind<E>, + for<'a> Dynamic<&'a OwnedStatic<T>>: DynBind<E>, + Dynamic<OwnedStatic<T>>: DynBind<E>, + Dynamic<BorrowedStatic<'ctx, T>>: DynBind<E>, + for<'a, 'b> Dynamic<&'a BorrowedStatic<'b, T>>: DynBind<E>, + for<'a> Dynamic<TempBorrowedStatic<'a, T>>: DynBind<E>, + for<'a> Dynamic<&'a TempBorrowedStatic<'a, T>>: DynBind<E>, + Dynamic<BorrowedMutStatic<'ctx, T>>: DynBind<E>, + for<'a, 'b> Dynamic<&'a BorrowedMutStatic<'b, T>>: DynBind<E>, + for<'a> Dynamic<TempBorrowedMutStatic<'a, T>>: DynBind<E>, + for<'a> Dynamic<&'a TempBorrowedMutStatic<'a, T>>: DynBind<E>, +{ + fn upcast_by_id_mut<'a, 'lt: 'a>( + &'a mut self, + id: crate::any::WithLtTypeId<'lt, 'ctx>, + ) -> Option<crate::any::MutAnyUnsized<'a, 'lt, 'ctx>> + where + 'ctx: 'lt, + { + dbg!(&id); + trait_by_id!(&mut self, id, { + type Impls<'lt, 'ctx> = (dyn RequestHint<'ctx, E>, dyn Value<'ctx, OwnedStatic<T>, E>); + + None + }) + } } +// any_trait! { +// impl['ctx, T][E] ValueBuilder<T, NotCloneable, E> = [ +// RequestHintProto<E>, +// ValueProto<OwnedStatic<T>, E>, +// ] where +// E: Environment, +// T: 'static, +// Dynamic<T>: DynBind<E>, +// for<'a> Dynamic<&'a T>: DynBind<E>, +// Dynamic<OwnedStatic<T>>: DynBind<E>, +// for<'a> Dynamic<&'a OwnedStatic<T>>: DynBind<E>, +// } +// +// any_trait! { +// impl['ctx, T][E] ValueBuilder<T, Cloneable, E> = [ +// RequestHintProto<E>, +// ValueProto<OwnedStatic<T>, E>, +// ValueProto<BorrowedStaticHrt<T>, E>, +// ValueProto<TempBorrowedStaticHrt<T>, E>, +// ValueProto<BorrowedMutStaticHrt<T>, E>, +// ValueProto<TempBorrowedMutStaticHrt<T>, E>, +// ] where +// E: Environment, +// T: 'static + Clone, +// Dynamic<T>: DynBind<E>, +// for<'a> Dynamic<&'a T>: DynBind<E>, +// for<'a> Dynamic<&'a OwnedStatic<T>>: DynBind<E>, +// Dynamic<OwnedStatic<T>>: DynBind<E>, +// Dynamic<BorrowedStatic<'ctx, T>>: DynBind<E>, +// for<'a, 'b> Dynamic<&'a BorrowedStatic<'b, T>>: DynBind<E>, +// for<'a> Dynamic<TempBorrowedStatic<'a, T>>: DynBind<E>, +// for<'a> Dynamic<&'a TempBorrowedStatic<'a, T>>: DynBind<E>, +// Dynamic<BorrowedMutStatic<'ctx, T>>: DynBind<E>, +// for<'a, 'b> Dynamic<&'a BorrowedMutStatic<'b, T>>: DynBind<E>, +// for<'a> Dynamic<TempBorrowedMutStatic<'a, T>>: DynBind<E>, +// for<'a> Dynamic<&'a TempBorrowedMutStatic<'a, T>>: DynBind<E>, +// } + impl<'ctx, T: 'static, E: Environment> RequestHint<'ctx, E> for ValueBuilder<T, NotCloneable, E> where Dynamic<T>: DynBind<E>, @@ -165,7 +212,7 @@ where 'ctx: 'this + 'walker, { E::with((self, walker), |(this, walker)| { - hint_protocol::<ValueProto<OwnedStatic<T>, E>, _>(walker.cast(), *this, ()).cast() + hint_protocol::<dyn Value<'_, OwnedStatic<T>, E>, _, _>(walker.cast(), *this, ()).cast() }) .map((), |_, (_, x)| x) .cast() @@ -197,34 +244,43 @@ where { E::value((self, walker)) .update((), |_, (this, walker)| { - hint_protocol::<ValueProto<OwnedStatic<T>, E>, _>(walker.cast(), *this, ()).cast() + hint_protocol::<dyn Value<'_, OwnedStatic<T>, E>, _, _>(walker.cast(), *this, ()) + .cast() }) .cast::<()>() .if_not_finished((), |_, (this, walker)| { - hint_protocol::<ValueProto<BorrowedStaticHrt<T>, E>, _>(walker.cast(), *this, ()) - .cast() + hint_protocol::< + dyn Value<'_, type_name::Raised<'_, '_, BorrowedStatic<'_, T>>, E>, + _, + _, + >(walker.cast(), *this, ()) + .cast() }) .cast::<()>() .if_not_finished((), |_, (this, walker)| { - hint_protocol::<ValueProto<TempBorrowedStaticHrt<T>, E>, _>( - walker.cast(), - *this, - (), - ) + hint_protocol::< + dyn Value<'_, type_name::Raised<'_, '_, TempBorrowedStatic<'_, T>>, E>, + _, + _, + >(walker.cast(), *this, ()) .cast() }) .cast::<()>() .if_not_finished((), |_, (this, walker)| { - hint_protocol::<ValueProto<BorrowedMutStaticHrt<T>, E>, _>(walker.cast(), *this, ()) - .cast() + hint_protocol::< + dyn Value<'_, type_name::Raised<'_, '_, BorrowedMutStatic<'_, T>>, E>, + _, + _, + >(walker.cast(), *this, ()) + .cast() }) .cast::<()>() .if_not_finished((), |_, (this, walker)| { - hint_protocol::<ValueProto<TempBorrowedMutStaticHrt<T>, E>, _>( - walker.cast(), - *this, - (), - ) + hint_protocol::< + dyn Value<'_, type_name::Raised<'_, '_, TempBorrowedMutStatic<'_, T>>, E>, + _, + _, + >(walker.cast(), *this, ()) .cast() }) .map((), |_, (_, x)| x) @@ -238,95 +294,125 @@ where Dynamic<T>: DynBind<E>, Dynamic<OwnedStatic<T>>: DynBind<E>, { - fn visit<'a>( - &'a mut self, - OwnedStatic(value): OwnedStatic<T>, - ) -> NativeForm<'a, VisitResult<Dynamic<OwnedStatic<T>>>, E> + fn visit<'this: 'value, 'value: 'e, 'e>( + &'this mut self, + value: type_name::Lowered<'value, 'ctx, OwnedStatic<T>>, + ) -> NativeForm<'e, VisitResult<Dynamic<type_name::Lowered<'value, 'ctx, OwnedStatic<T>>>>, E> where - 'ctx: 'a, + type_name::Lowered<'value, 'ctx, OwnedStatic<T>>: Sized, + Dynamic<type_name::Lowered<'value, 'ctx, OwnedStatic<T>>>: DynBind<E>, + 'ctx: 'this + 'value, { - self.value = Some(Dynamic(value)); + self.value = Some(Dynamic(value.0)); E::value(Flow::Done.into()).cast() } } -impl<'ctx, T: 'static, E: Environment> Value<'ctx, BorrowedStaticHrt<T>, E> +impl<'ctx, T: 'static, E: Environment> + Value<'ctx, type_name::Raised<'static, 'ctx, BorrowedStatic<'ctx, T>>, E> for ValueBuilder<T, Cloneable, E> where T: Clone, Dynamic<T>: DynBind<E>, Dynamic<BorrowedStatic<'ctx, T>>: DynBind<E>, { - fn visit<'a>( - &'a mut self, - BorrowedStatic(value): BorrowedStatic<'ctx, T>, - ) -> NativeForm<'a, VisitResult<Dynamic<BorrowedStatic<'ctx, T>>>, E> - where - 'ctx: 'a, - { - self.value = Some(Dynamic(value.clone())); - - E::value(Flow::Done.into()).cast() - } -} - -impl<'ctx, T: 'static, E: Environment> Value<'ctx, TempBorrowedStaticHrt<T>, E> - for ValueBuilder<T, Cloneable, E> -where - T: Clone, - Dynamic<T>: DynBind<E>, - for<'a> Dynamic<TempBorrowedStatic<'a, T>>: DynBind<E>, -{ - fn visit<'a>( - &'a mut self, - TempBorrowedStatic(value): TempBorrowedStatic<'a, T>, - ) -> NativeForm<'a, VisitResult<Dynamic<TempBorrowedStatic<'a, T>>>, E> - where - 'ctx: 'a, - { - self.value = Some(Dynamic(value.clone())); - - E::value(Flow::Done.into()).cast() - } -} - -impl<'ctx, T: 'static, E: Environment> Value<'ctx, BorrowedMutStaticHrt<T>, E> - for ValueBuilder<T, Cloneable, E> -where - T: Clone, - Dynamic<T>: DynBind<E>, - Dynamic<BorrowedMutStatic<'ctx, T>>: DynBind<E>, -{ - fn visit<'a>( - &'a mut self, - BorrowedMutStatic(value): BorrowedMutStatic<'ctx, T>, - ) -> NativeForm<'a, VisitResult<Dynamic<BorrowedMutStatic<'ctx, T>>>, E> + fn visit<'this: 'value, 'value: 'e, 'e>( + &'this mut self, + value: type_name::Lowered< + 'value, + 'ctx, + type_name::Raised<'static, 'ctx, BorrowedStatic<'ctx, T>>, + >, + ) -> NativeForm< + 'e, + VisitResult< + Dynamic< + type_name::Lowered< + 'value, + 'ctx, + type_name::Raised<'static, 'ctx, BorrowedStatic<'ctx, T>>, + >, + >, + >, + E, + > where - 'ctx: 'a, + type_name::Lowered<'value, 'ctx, type_name::Raised<'static, 'ctx, BorrowedStatic<'ctx, T>>>: + Sized, + Dynamic< + type_name::Lowered< + 'value, + 'ctx, + type_name::Raised<'static, 'ctx, BorrowedStatic<'ctx, T>>, + >, + >: DynBind<E>, + 'ctx: 'this + 'value, { - self.value = Some(Dynamic(value.clone())); + self.value = Some(Dynamic(value.0.clone())); E::value(Flow::Done.into()).cast() } } -impl<'ctx, T: 'static, E: Environment> Value<'ctx, TempBorrowedMutStaticHrt<T>, E> - for ValueBuilder<T, Cloneable, E> -where - T: Clone, - Dynamic<T>: DynBind<E>, - for<'a> Dynamic<TempBorrowedMutStatic<'a, T>>: DynBind<E>, -{ - fn visit<'a>( - &'a mut self, - TempBorrowedMutStatic(value): TempBorrowedMutStatic<'a, T>, - ) -> NativeForm<'a, VisitResult<Dynamic<TempBorrowedMutStatic<'a, T>>>, E> - where - 'ctx: 'a, - { - self.value = Some(Dynamic(value.clone())); - - E::value(Flow::Done.into()).cast() - } -} +// impl<'ctx, T: 'static, E: Environment> +// Value<'ctx, type_name::Raised<'static, 'ctx, TempBorrowedStatic<'static, T>>, E> +// for ValueBuilder<T, Cloneable, E> +// where +// T: Clone, +// Dynamic<T>: DynBind<E>, +// for<'a> Dynamic<TempBorrowedStatic<'a, T>>: DynBind<E>, +// { +// fn visit<'a>( +// &'a mut self, +// TempBorrowedStatic(value): TempBorrowedStatic<'a, T>, +// ) -> NativeForm<'a, VisitResult<Dynamic<TempBorrowedStatic<'a, T>>>, E> +// where +// 'ctx: 'a, +// { +// self.value = Some(Dynamic(value.clone())); +// +// E::value(Flow::Done.into()).cast() +// } +// } +// +// impl<'ctx, T: 'static, E: Environment> Value<'ctx, BorrowedMutStatic<'ctx, T>, E> +// for ValueBuilder<T, Cloneable, E> +// where +// T: Clone, +// Dynamic<T>: DynBind<E>, +// Dynamic<BorrowedMutStatic<'ctx, T>>: DynBind<E>, +// { +// fn visit<'a>( +// &'a mut self, +// BorrowedMutStatic(value): BorrowedMutStatic<'ctx, T>, +// ) -> NativeForm<'a, VisitResult<Dynamic<BorrowedMutStatic<'ctx, T>>>, E> +// where +// 'ctx: 'a, +// { +// self.value = Some(Dynamic(value.clone())); +// +// E::value(Flow::Done.into()).cast() +// } +// } +// +// impl<'ctx, T: 'static, E: Environment> +// Value<'ctx, type_name::Raised<'static, 'ctx, BorrowedMutStatic<'static, T>>, E> +// for ValueBuilder<T, Cloneable, E> +// where +// T: Clone, +// Dynamic<T>: DynBind<E>, +// for<'a> Dynamic<TempBorrowedMutStatic<'a, T>>: DynBind<E>, +// { +// fn visit<'a>( +// &'a mut self, +// TempBorrowedMutStatic(value): TempBorrowedMutStatic<'a, T>, +// ) -> NativeForm<'a, VisitResult<Dynamic<TempBorrowedMutStatic<'a, T>>>, E> +// where +// 'ctx: 'a, +// { +// self.value = Some(Dynamic(value.clone())); +// +// E::value(Flow::Done.into()).cast() +// } +// } |