Diffstat (limited to 'src/build/builders/core/value.rs')
-rw-r--r--src/build/builders/core/value.rs356
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()
+// }
+// }