Diffstat (limited to 'src/build/builders/core/value.rs')
-rw-r--r--src/build/builders/core/value.rs95
1 files changed, 71 insertions, 24 deletions
diff --git a/src/build/builders/core/value.rs b/src/build/builders/core/value.rs
index 1109b51..55a0e99 100644
--- a/src/build/builders/core/value.rs
+++ b/src/build/builders/core/value.rs
@@ -5,6 +5,7 @@ use effectful::{
effective::Effective,
environment::{DynBind, Environment, NativeForm},
higher_ranked::Mut, SendSync,
+ bound::Dynamic,
};
use crate::{
@@ -53,27 +54,33 @@ pub enum NotCloneable {}
/// After
#[derive(SendSync)]
pub struct ValueBuilder<T, Clone, E> {
- value: Option<T>,
+ value: Option<Dynamic<T>>,
_marker: Marker<(E, Clone)>,
}
-impl<T, Clone, E: Environment> crate::BuilderTypes<E> for ValueBuilder<T, Clone, E>
+impl<T, Clone, E: Environment> crate::BuilderTypes<E> for ValueBuilder<T, Clone, E>
where
- T: DynBind<E>,
+ Dynamic<T>: DynBind<E>
{
type Error = ValueError<T>;
+ type Output = Dynamic<T>;
+
type Value = T;
type Seed = ();
+
+ fn unwrap_output(output: Self::Output) -> Self::Value {
+ output.0
+ }
}
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>,
- T: DynBind<E>,
{
- fn build<'a>(self) -> NativeForm<'a, Result<Self::Value, Self::Error>, E>
+ fn build<'a>(self) -> NativeForm<'a, Result<Self::Output, Self::Error>, E>
where
Self: 'a,
{
@@ -110,7 +117,11 @@ any_trait! {
ValueProto<OwnedStatic<T>, E>,
] where
E: Environment,
- T: DynBind<E> + IsSync<E::NeedSend> + 'static
+ 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! {
@@ -123,12 +134,27 @@ any_trait! {
ValueProto<TempBorrowedMutStaticHrt<T>, E>,
] where
E: Environment,
- T: DynBind<E> + IsSync<E::NeedSend> + 'static + Clone,
+ 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
- T: DynBind<E> + IsSync<E::NeedSend>,
+ 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 request_hint<'this: 'e, 'walker: 'e, 'e>(
&'this mut self,
@@ -147,7 +173,19 @@ where
impl<'ctx, T: 'static, E: Environment> RequestHint<'ctx, E> for ValueBuilder<T, Cloneable, E>
where
- T: DynBind<E> + IsSync<E::NeedSend> + Clone,
+ T: Clone,
+ Dynamic<T>: DynBind<E>,
+ for<'a> Dynamic<&'a T>: DynBind<E>,
+ Dynamic<OwnedStatic<T>>: DynBind<E>,
+ for<'a> Dynamic<&'a 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 request_hint<'this: 'e, 'walker: 'e, 'e>(
&'this mut self,
@@ -196,16 +234,17 @@ where
impl<'ctx, T: 'static, Clone, E: Environment> Value<'ctx, OwnedStatic<T>, E>
for ValueBuilder<T, Clone, E>
where
- T: DynBind<E>,
+ Dynamic<T>: DynBind<E>,
+ Dynamic<OwnedStatic<T>>: DynBind<E>,
{
fn visit<'a>(
&'a mut self,
OwnedStatic(value): OwnedStatic<T>,
- ) -> NativeForm<'a, VisitResult<OwnedStatic<T>>, E>
+ ) -> NativeForm<'a, VisitResult<Dynamic<OwnedStatic<T>>>, E>
where
'ctx: 'a,
{
- self.value = Some(value);
+ self.value = Some(Dynamic(value));
E::value(Flow::Done.into()).cast()
}
@@ -214,16 +253,18 @@ where
impl<'ctx, T: 'static, E: Environment> Value<'ctx, BorrowedStaticHrt<T>, E>
for ValueBuilder<T, Cloneable, E>
where
- T: Clone + DynBind<E> + IsSync<E::NeedSend>,
+ 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<BorrowedStatic<'ctx, T>>, E>
+ ) -> NativeForm<'a, VisitResult<Dynamic<BorrowedStatic<'ctx, T>>>, E>
where
'ctx: 'a,
{
- self.value = Some(value.clone());
+ self.value = Some(Dynamic(value.clone()));
E::value(Flow::Done.into()).cast()
}
@@ -232,16 +273,18 @@ where
impl<'ctx, T: 'static, E: Environment> Value<'ctx, TempBorrowedStaticHrt<T>, E>
for ValueBuilder<T, Cloneable, E>
where
- T: Clone + DynBind<E> + IsSync<E::NeedSend>,
+ 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<TempBorrowedStatic<'a, T>>, E>
+ ) -> NativeForm<'a, VisitResult<Dynamic<TempBorrowedStatic<'a, T>>>, E>
where
'ctx: 'a,
{
- self.value = Some(value.clone());
+ self.value = Some(Dynamic(value.clone()));
E::value(Flow::Done.into()).cast()
}
@@ -250,16 +293,18 @@ where
impl<'ctx, T: 'static, E: Environment> Value<'ctx, BorrowedMutStaticHrt<T>, E>
for ValueBuilder<T, Cloneable, E>
where
- T: Clone + DynBind<E> + IsSync<E::NeedSend>,
+ 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<BorrowedMutStatic<'ctx, T>>, E>
+ ) -> NativeForm<'a, VisitResult<Dynamic<BorrowedMutStatic<'ctx, T>>>, E>
where
'ctx: 'a,
{
- self.value = Some(value.clone());
+ self.value = Some(Dynamic(value.clone()));
E::value(Flow::Done.into()).cast()
}
@@ -268,16 +313,18 @@ where
impl<'ctx, T: 'static, E: Environment> Value<'ctx, TempBorrowedMutStaticHrt<T>, E>
for ValueBuilder<T, Cloneable, E>
where
- T: Clone + DynBind<E> + IsSync<E::NeedSend>,
+ 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<TempBorrowedMutStatic<'a, T>>, E>
+ ) -> NativeForm<'a, VisitResult<Dynamic<TempBorrowedMutStatic<'a, T>>>, E>
where
'ctx: 'a,
{
- self.value = Some(value.clone());
+ self.value = Some(Dynamic(value.clone()));
E::value(Flow::Done.into()).cast()
}