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